8. 冒泡法排序和快速排序(基于openCV)
一、前言
主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用。
二、冒泡法排序
冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为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)的更多相关文章
- 【Java基础】选择排序、冒泡法排序、二分法查找
1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...
- Java温故而知新-冒泡法排序
冒泡法排序是各种初学者在学习数组与循环结构时都会练习的一种简单排序算法. 冒泡法的精髓在于比较相邻的两个元素,较大的元素会不断的排到队伍后面去,就像水里的泡泡一样不断向上跑. 想像一下倒在一个透明玻璃 ...
- Python 冒泡法排序
def sequence(disorder='', separators=''): arrays = disorder.split(separators) def desc(): for i in r ...
- C#冒泡法排序源码
如下内容内容是关于C#冒泡法排序的内容,应该对码农有一些用途. int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 }; for( int j ...
- [python,2018-01-15] 冒泡法排序
想写一个冒泡法排序,没什么思路,就先写了个java的 public static void main(String[] args) { int array[] = {88,2,43,12,34,8,6 ...
- C语言 · 冒泡法排序
算法提高 冒泡法排序 时间限制:1.0s 内存限制:512.0MB 输入10个数,用“冒泡法”对10个数排序(由小到大)这10个数字在100以内. 样例输入 1 3 6 8 2 7 ...
- C程序数组算法 — 冒泡法排序【前冒 || 后冒】
第一种写法(前冒泡): /* C程序数组算法 - 冒泡法排序 * 此例子按照 大 -> 小 排序 * 原理:两两相比较,然后进行大小对调 * 比较次数: n^2 次 * 说明:冒泡排序是相对稳定 ...
- 冒泡法排序_c++实现
看完了郝斌老师的c语言视频,冒泡法排序,就试着写了.我觉得学习算法最重要的不是代码,而是它的原理. 代码: /** 2 * Copyright (c) 1991 - 2016 Arvin Tang. ...
- php 实现冒泡算法排序、快速排序、选择排序,插入排序
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...
随机推荐
- Picasso – Android系统的图片下载和缓存类库
Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目.该项目和其他一些下载图片项目的主要区别之一是:使用4.0 ...
- [CSAPP笔记][第十一章网络编程]
第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...
- Windows服务简单实例
1.定时器使用 partial class TimerService : ServiceBase { public TimerService() { InitializeComponent(); } ...
- Windows命令行(DOS命令)教程-3(转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_2.html
五.常用命令 DOS命令总共大约有一百个(包括文本编辑.查杀病毒.配置文件.批处理等),我们这里详细介绍二十个常用的DOS命令. 先介绍一下通配符的概念. 通配符*和? *表示一个字符串 ?只代表一个 ...
- C++中explicit
[explicit] 1.用于抑制隐式转换,即: X x = ; // error X x(); // ok 2.只对一个实参的构造函数有效,但是,可以用多有多个实参的构造函数,目前没有意义: cla ...
- CSS: Table-Layout & Word-Break 设置表和列的宽度固定不变
1. 设置Table的列宽由表格宽度和列宽度设定(指定表格宽度,各个列宽度): table#tbl_id{table-layout:fixed;} 2. 设置TD内容根据宽度进行换行,即使字符串之间无 ...
- 当list中有中文,打印的时候显示为字符编码的问题
当list中有中文时,print list显示的会是字符编码,比如: 用str()当然也不行: 在不安装其他包的情况下,目前我知道的解决办法是使用decode('string_escape'),如下:
- 【好程序员笔记分享】——iOS开发之纯代码键盘退出
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单) iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...
- [linux]linux下开启wifi热点
网上说用 ap-hotspot可以,但是我测试的时候总是在start的时候卡主,试了以前的版本也是,最后找到了下面的方法. 第一步:安装 plasma-nm 可以使用下面的命令 sudo apt-ge ...
- 在C中嵌入汇编
早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译. 其实在KEIL中嵌入汇编的方法很简单.如图一,在C文件中 ...