一、前言

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

二、冒泡法排序

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

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

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

三、快速排序

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

四、代码实现

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

 void SparseGraphic::BubbleSort(const cv::Mat inMat, QVector<int> &index, cv::Mat &outMat)
{
if(inMat.rows!= )
return;
int col = inMat.cols;
index = QVector<int>(col);
for(int i = ;i<col;i++)
{
index[i] = i;
}
if(inMat.type()!= CV_32F)
inMat.convertTo(inMat,CV_32F);
outMat = inMat.clone(); float *ptr = outMat.ptr<float>();
float tmpVal;
int tmpIdx;
for(int i = ;i<col;i++)
{
for(int j = ;j<col - i -;j++)
{
if(ptr[j]>ptr[j+])
{
tmpVal = ptr[j];
ptr[j]=ptr[j+];
ptr[j+]=tmpVal;
tmpIdx = index[j];
index[j] = index[j+];
index[j+] = tmpIdx;
}
}
}
}

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

 void SparseGraphic::QuickSort(cv::Mat inMat, QVector<int> &index, int low,int high)
{
if(inMat.rows!=)
return;
float *ptr = inMat.ptr<float>();
if(low < high)
{
int i = low,j = high;
float X = ptr[low];
while(i<j)
{
while(i<j && ptr[j] >= X)
j--;
if(i<j)
{
ptr[i++] = ptr[j];
int tmp = index[j];
index[j] = index[i-];
index[i-] = tmp;
} while(i<j && ptr[i] < X)
i++;
if(i<j)
{
ptr[j--] = ptr[i];
int tmp = index[i];
index[i] = index[j+];
index[j+] = tmp;
}
}
ptr[i] = X;
QuickSort(inMat,index,low,i-);
QuickSort(inMat,index,i+,high);
}
}

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

  1. 【Java基础】选择排序、冒泡法排序、二分法查找

    1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...

  2. Java温故而知新-冒泡法排序

    冒泡法排序是各种初学者在学习数组与循环结构时都会练习的一种简单排序算法. 冒泡法的精髓在于比较相邻的两个元素,较大的元素会不断的排到队伍后面去,就像水里的泡泡一样不断向上跑. 想像一下倒在一个透明玻璃 ...

  3. Python 冒泡法排序

    def sequence(disorder='', separators=''): arrays = disorder.split(separators) def desc(): for i in r ...

  4. C#冒泡法排序源码

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

  5. [python,2018-01-15] 冒泡法排序

    想写一个冒泡法排序,没什么思路,就先写了个java的 public static void main(String[] args) { int array[] = {88,2,43,12,34,8,6 ...

  6. C语言 · 冒泡法排序

    算法提高 冒泡法排序   时间限制:1.0s   内存限制:512.0MB      输入10个数,用“冒泡法”对10个数排序(由小到大)这10个数字在100以内. 样例输入 1 3 6 8 2 7 ...

  7. C程序数组算法 — 冒泡法排序【前冒 || 后冒】

    第一种写法(前冒泡): /* C程序数组算法 - 冒泡法排序 * 此例子按照 大 -> 小 排序 * 原理:两两相比较,然后进行大小对调 * 比较次数: n^2 次 * 说明:冒泡排序是相对稳定 ...

  8. 冒泡法排序_c++实现

    看完了郝斌老师的c语言视频,冒泡法排序,就试着写了.我觉得学习算法最重要的不是代码,而是它的原理. 代码: /** 2 * Copyright (c) 1991 - 2016 Arvin Tang. ...

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

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

随机推荐

  1. AngularJS初步

    AngularJS特点 遵循AMD规范 不需要操作节点 对于jquery,一般是利用现有完整的DOM,然后在这戏Dom的基础上进行二次调教了:而对于AngularJS等框架则是根据数据模型以及其对应用 ...

  2. 私人C#笔记

      coust 定义常量 string是密封类,所以不能继承它 namespace默认是按照文件夹的结构命名的,如(System.文件夹.子文件夹),而且namespace是可以手动改的   Arra ...

  3. oracle插入例子

    string sql = "insert into EMST_JC_SBXX(XL,SBBM,SBWH,SBMC,CCBM,XNCS,CZXL,ZL,GL,ZZCJ,TCRQ,SYQX,XH ...

  4. FineUI表单验证

    自动编码文本 默认情况下,Label的EncodeText属性为true,会对文本中的HTML进行编码.当然我们也可以设置EncodeText=false,从而将HTML片段赋值给Text属性,请看这 ...

  5. CCFileUtils::getFileData疑惑

    背景 这几天在使用cocos2d-x读取磁盘文件的时候,发现了CCFileUtils中一点不合理的地方,特此记录,以供研讨. 项目结构 ①我使用的是cocos2d-x 2.1.3版本,CCFileUt ...

  6. web worker使用

    使用postMessage()方法传递信息.来自Worker的数据保存在event.data中.通过message和error事件与页面通信. <script> var data = [4 ...

  7. Kendo Web UI Grid里时间格式转换

    我和大家分享一下我的kendo的学习心得.如果不好的地方多多包含或者给我留言请看图 kendo里时间格式如图Oder Date列里的格式.但是我们想把时间转换成中国人习惯的格式.如Shipped Da ...

  8. akoj-1140-英雄联盟阵营

    英雄联盟阵营 Time Limit:1000MS  Memory Limit:65536KTotal Submit:54 Accepted:16 Description 符文之地——瓦罗兰,作为最大的 ...

  9. Java学习笔记--Swing2D图形

    1.处理2D图形 要想使用java 2D库绘制图形,需要获得一个Graphics2D类对象.这个类是Graphics类的子类.paintComponent方法自动获得一个Graphics2D类对象,我 ...

  10. 为什么1Byte=8bit

    Byte是字节的意思,而字节在早期计算机内部是用标准ASCII码来表示的根据当时情况确定至多有128种需要表示的字符(当时是IBM的标准,现在普遍是255),也就是2的7次方用二进制的0和1来表示就需 ...