最新文章
热门文章
- C++实现快速排序
阅读量:5708
- QListWidget添加QCheckBox控件
阅读量:4165
- 大学毕业第一份工作重要吗?这篇文章读透你就明白了
阅读量:778
- 界面多语言国际化的实现
阅读量:627
- 优秀API的几大特征
阅读量:242
最新评论
C++实现快速排序
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
以一个数组作为示例,取区间第一个数为基准数。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
72 |
6 |
57 |
88 |
60 |
42 |
83 |
73 |
48 |
85 |
初始时,i = 0; j =9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8];i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3];j--;
数组变为:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
48 |
6 |
57 |
88 |
60 |
42 |
83 |
73 |
88 |
85 |
i = 3; j =7; X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
数组变为:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
48 |
6 |
57 |
42 |
60 |
72 |
83 |
73 |
88 |
85 |
可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。
对挖坑填数进行总结
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
代码如下:
- #include<iostream>
- using namespace std;
- void quickSort(int a[],int,int);
- int main()
- {
- int array[]={34,65,12,43,67,5,78,10,3,70},k;
- int len=sizeof(array)/sizeof(int);
- cout<<"The orginal arrayare:"<<endl;
- for(k=0;k<len;k++)
- cout<<array[k]<<",";
- cout<<endl;
- quickSort(array,0,len-1);
- cout<<"The sorted arrayare:"<<endl;
- for(k=0;k<len;k++)
- cout<<array[k]<<",";
- cout<<endl;
- system("pause");
- return 0;
- }
- void quickSort(int s[], int l, int r)
- {
- if (l< r)
- {
- int i = l, j = r, x = s[l];
- while (i < j)
- {
- while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
- j--;
- if(i < j)
- s[i++] = s[j];
- while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
- i++;
- if(i < j)
- s[j--] = s[i];
- }
- s[i] = x;
- quickSort(s, l, i - 1); // 递归调用
- quickSort(s, i + 1, r);
- }
- }
原文地址:http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html
《人工智能工程师直通车》
学院
2018年04月26日 14:39
快速选择算法(基于快排) - CSDN博客
这样我们消耗的时间为T(n)=T(k)+cn,其中,k为我们所进入的那半部分元素的个数,当然,由于众所周知的快排不稳定性,即使是快速选择也有可能给我们玩出O(n2)的...
2018-1-19
快速排序 - 大道至简 - CSDN博客
快排,快排,不快怎么行呢! 但我们在实际应用中,处理大量数据时,如果采用普通排序(如冒泡排序)就会使得时间复杂度变为O(N^2),这是我们我们不愿意看到的。 而...
2017-7-29
快速排序算法详细讲解c++版
快速排序算法 1.首先我需要对快速排序算法下个定义:什么是快排呢?或者是排序的指导思想比如一个待排序的数组 int iArray[] = {5,4,45,878,45}; 我们需要把这个数组从...
Kruskal算法最小生成树(快排优化版)源代码+实验报告参考模板-CSDN...
资源所需积分/C币 当前拥有积分 当前拥有C币 5 0 0 点击完成任务获取下载码 输入下载码 为了良好体验,不建议使用迅雷下载Kruskal算法最小生成树(快排优化版)源...
2018-4-18
C++经典面试题(二) - CSDN博客
c++ / c / 1994 编辑 删除 最近看一些面试题,觉得如果自己被问到了,并不...各个软件公司+面试题+笔试题+c+c%2B%2B有答案.rar 2009年05月26日 00:22...
2018-3-29
C++ algorithm sort自定义排序 - CSDN博客
2018-4-24
c++双向链表的建立于插入
C语言讲解 清华大学C%2B%2B程序设计教程(唐浩强)-上.pdf 时间:2018-4-22 C++实现异质链表 时间:2018-4-20(C++版)链表(三)——实现双向链表的创建、插入、...
2018-4-25
我的第一个c++程序哈哈哈 - CSDN博客
排序:选择排序法,冒泡排序法,快排(C,C++) (766) CSS语法格式 (747) 最新评论 ccf真题-201604-3-.路... coord_: 就是cin那里卡了,幸亏看了博主博客...
2018-4-15
HbFS- - CSDN博客
2018-4-6
快速排序的两种实现思路和非递归实现--C++实现
思路一: 第一种是根据算法导论上的思想:取数组的最后一个元素为主元,i初始化为最低位元素的前一个位置,j指向遍历数组中待排序的元素,当j所指元素比主元小的时候i= i + 1,然后交换...
[C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章
最近在做LeetCode的题目、面试和笔试后发现经常考察快速排序的知识。通过这篇文章介绍,能让你彻底的了解和学习快排,主要从一下三个部分进行介绍: 一.C语言实现qsort快速排序 ...
C++程序---快速排序
2009年04月10日 2KB 下载
2
收藏
评论
AA2519556:[reply]upc_xbt[/reply] 是的,当时就想加个复选框,看了你的分享了,写的很好,
ganggegel:很好,感谢分享
upc_xbt:你好,不知博主为什么用这种方式实现? 是为了让给QlistWidgets添加复选框也是就是为了吧C...