8. 冒泡法排序和快速排序(基于openCV)

一、前言

主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用。

二、冒泡法排序

冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为O(n2)。主要思想如下:

分为内外循环,每次外循环确定一个大的数据的具体位置,如下实例:

从图中可以看出,进过两次外循环就可以得到排序结果,随后的8次循环都浪费了,为了避免这种情况,我们可以设置一个状态参数,用来表示内循环是否发生数据的交换,从而作为外循环是否退出的信号。

三、快速排序

快速排序是最有效的排序方法之一,其主要思想是对数据进行分开排序,通过选择一个基数,然后将所要排序的数据分成两部分,一边全大,一边全小。然后利用递归的思想对分开的数据继续排序。

四、代码实现

冒泡法排序(输出排序后数据在原数据中的位置):

 1 void SparseGraphic::BubbleSort(const cv::Mat inMat, QVector<int> &index, cv::Mat &outMat)
 2 {
 3     if(inMat.rows!= 1)
 4         return;
 5     int col = inMat.cols;
 6     index = QVector<int>(col);
 7     for(int i = 0;i<col;i++)
 8     {
 9         index[i] = i;
10     }
11     if(inMat.type()!= CV_32F)
12         inMat.convertTo(inMat,CV_32F);
13     outMat = inMat.clone();
14
15     float *ptr = outMat.ptr<float>(0);
16     float tmpVal;
17     int tmpIdx;
18     for(int i = 0;i<col;i++)
19     {
20         for(int j = 0;j<col - i -1;j++)
21         {
22             if(ptr[j]>ptr[j+1])
23             {
24                 tmpVal = ptr[j];
25                 ptr[j]=ptr[j+1];
26                 ptr[j+1]=tmpVal;
27                 tmpIdx = index[j];
28                 index[j] = index[j+1];
29                 index[j+1] = tmpIdx;
30             }
31         }
32     }
33 }

快速排序(输出排序后数据在源数据中的位置):

 1 void SparseGraphic::QuickSort(cv::Mat inMat, QVector<int> &index, int low,int high)
 2 {
 3     if(inMat.rows!=1)
 4         return;
 5     float *ptr = inMat.ptr<float>(0);
 6     if(low < high)
 7     {
 8         int i = low,j = high;
 9         float X = ptr[low];
10         while(i<j)
11         {
12             while(i<j && ptr[j] >= X)
13                 j--;
14             if(i<j)
15             {
16                 ptr[i++] = ptr[j];
17                 int tmp = index[j];
18                 index[j] = index[i-1];
19                 index[i-1] = tmp;
20             }
21
22             while(i<j && ptr[i] < X)
23                 i++;
24             if(i<j)
25             {
26                 ptr[j--] = ptr[i];
27                 int tmp = index[i];
28                 index[i] = index[j+1];
29                 index[j+1] = tmp;
30             }
31         }
32         ptr[i] = X;
33         QuickSort(inMat,index,low,i-1);
34         QuickSort(inMat,index,i+1,high);
35     }
36 }
时间: 2024-10-24 16:53:22

8. 冒泡法排序和快速排序(基于openCV)的相关文章

数组-03. 冒泡法排序

数组-03. 冒泡法排序(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的元素.然后用同样的方法对前N-1个元素进行第二遍扫描.依此类推,最后只需处理两个元素,就完成了对N个数的排序. 本题要求对任意给定的K(<N),输出扫描完第K遍后的中间

数组-03. 冒泡法排序(20)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int i,j,n,k,a[100],tmp; 5 cin>>n>>k; 6 for(i=0;i<n;++i) 7 cin>>a[i]; 8 for(j=0;j<k;++j) 9 for(i=0;i<n-j-1;++i) //注意-1 10 if(a[i]>a[i+1]){ 11 tmp=a[i]; 12 a[i]=

冒泡法排序_c++实现

看完了郝斌老师的c语言视频,冒泡法排序,就试着写了.我觉得学习算法最重要的不是代码,而是它的原理. 代码: 1 /** 2 * Copyright (c) 1991 - 2016 Arvin Tang. 3 * All rights reserved. 4 * 5 * 文件名称:郝斌C语言视频教程_163_冒泡排序 6 * 简要描述:用冒泡法排序 7 * 8 * 当前版本:1.0 9 * 作 者: 10 * 完成日期:2016-1-9 11 * 修订说明: 12 * 13 * 取代版本: 14

选择法和冒泡法排序接口

#define ret_ok 0 #define ret_err 1 #define ARRAY_SIZE 10 /*选择法排序*/ int Choice_Sort(int array[],int array_len) { int i = 0; int j = 0; int iMin = 0; int iTemp = 0; int iFlag = 0; for(i=0;i<array_len-1;i++) { iMin = i; for(j=i+1;j<array_len;j++) { if(

C语言实现冒泡法排序

首先我们看冒泡法排序的原理,假设有一个包含6个数字的数组其思路为:每次将相邻两个数比较,将小的调到前面,如果有6个数:8,7,5,4,2,0.第一次先将最前面的两个数8和7对调(看下图).第二次将第二个数和第三个数(8和5)对调.....如此总计进行了5次,得到7-5-4-2-0-8的顺序,可以看到:最大的数8已经沉底,成为最下面的一个数,而小的数上升.经过第一轮(5次比较)后,得到了最大的数9.   然后进行第二轮的比较(见下图),对余下的7,5,4,2,0进行新一轮的比较,以便使次大的数沉底

C#冒泡法排序源码

如下内容内容是关于C#冒泡法排序的内容,应该对码农有一些用途. int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 }; for( int j=1;j<myArray.Length;j ++ ) { for(int i=0;i<myArray.Length - 1;i ++) { if( myArray[i]>myArray[i+1]) { int temp = myArray[i]; myArray[i] = myArray[i

php 实现冒泡算法排序、快速排序、选择排序,插入排序

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序.  $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法   *     思路分析:法如其名,就是像冒

php 冒泡法 排序

1 <?php 2 /** 3 * php 冒泡法 4 * @param $arr 5 * @param string $order 排序符 6 * @return $arr 7 */ 8 function orderarr(&$arr, $order = 'asc') 9 { 10 if (!$arr) return false; 11 $len = count($arr); 12 for ($i = 0; $i < $len; $i++) { 13 for ($j = 1; $j

一个循环实现冒泡法排序(并没有什么卵用)

冒泡法时间复杂度为O(n^2) 这个是改不了的 不可能因为用一个循环实现,就变成了O(N)... 所以,并没有什么卵用,只是一种写代码的方式而已... //Swap 用宏实现 #define Swap(a,b,c) ((c)=(a),(a)=(b),(b)=(c)) //第一种方式,,,最简单的 void BubbleSortOneLoop(int ar[], int n) { int i = 0; int l = 0; while (i < n - 1)//i还是控制最外层 { if (ar[