快速排序——一步一步算法篇
2016-05-12 07:31
295 查看
快速排序
快速排序是对冒泡排序的一种改进
基本思想:在待排序的数据中找出一个枢轴,这个枢轴可以在两侧,可以在中间。然后通过一趟排序将这组数据分成两部分,使一部分的数据要比枢轴大,另一部分数据要比枢轴小,但这两部分数据仍是无序的。再通过递归和循环排序,将这两部分数据重复上面过程,从而达到让整个序列有序。
假设待排序列为{a[1],a[1+1],a[1+2],…,a[r]},首先任意选取一个枢轴或支点作为排序的关键,然后通过一趟排序,将比这个数轴小的数都放在这个枢轴的左侧(左子序列),比这个枢轴大的数放在它的右侧(右子序列)。然后再在两个子序列中重复上列过程,完成排序,这个过程称为快速排序。
快速排序基本思想
具体做法:设置两个指针i,j,赋其初值为l,r,设中间的数为枢轴*mid,从i开始向前搜索,搜索第一个到比枢轴大的数停止,然后从j开始向后搜索,搜索到第一个比枢轴小的数停止,然后将两个数交换,重复上列过程,利用递归*,完成排序。
示例一:
示例二:
图片来自:/article/8227143.html
下面的代码第一个数为枢轴
此代码转自:http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html
复杂性:
快速排序虽然在c++中存在函数,但这种思想仍然需要将其掌握。
一步一步算法篇
快速排序是对冒泡排序的一种改进
基本思想:在待排序的数据中找出一个枢轴,这个枢轴可以在两侧,可以在中间。然后通过一趟排序将这组数据分成两部分,使一部分的数据要比枢轴大,另一部分数据要比枢轴小,但这两部分数据仍是无序的。再通过递归和循环排序,将这两部分数据重复上面过程,从而达到让整个序列有序。
假设待排序列为{a[1],a[1+1],a[1+2],…,a[r]},首先任意选取一个枢轴或支点作为排序的关键,然后通过一趟排序,将比这个数轴小的数都放在这个枢轴的左侧(左子序列),比这个枢轴大的数放在它的右侧(右子序列)。然后再在两个子序列中重复上列过程,完成排序,这个过程称为快速排序。
快速排序基本思想
具体做法:设置两个指针i,j,赋其初值为l,r,设中间的数为枢轴*mid,从i开始向前搜索,搜索第一个到比枢轴大的数停止,然后从j开始向后搜索,搜索到第一个比枢轴小的数停止,然后将两个数交换,重复上列过程,利用递归*,完成排序。
示例一:
示例二:
图片来自:/article/8227143.html
#include<iostream> #include<cstdio> using namespace std; int a[101];int n; void ysort(int,int); int main() { int k,o; cin>>n; for(k=1;k<=n;k++) cin>>a[k]; ysort(1,n); for(int o=1;o<=n;o++) cout<<a[o]<<" "; } void ysort (int l,int r) { int i,j,mid,p; i=l;j=r; mid=a[(l+r)/2]; //将中间数作为枢轴 do { while(a[i]<mid) i++; //在左半部分寻找比中间数大的数 while(a[j]>mid) j--; //在右半部分寻找比中间数小的数 if(i<=j) { p=a[i];a[i]=a[j];a[j]=p; //找到与排序目标不同的数对,交换他们 i++;j--; //并将指针下移 } } while(i<j); //这里是否有等号?(我也不知道,应该加上) if(l<j) ysort(l,j); //递归 if(i<r) ysort(i,r); //递归 }
下面的代码第一个数为枢轴
此代码转自:http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html
#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); } }
复杂性:
快速排序虽然在c++中存在函数,但这种思想仍然需要将其掌握。
一步一步算法篇
相关文章推荐
- 三层学习之初相识
- linux mrtg cacti nagios zabbix对比
- Java设计模式(九) 桥接模式
- 转载 在.net中使用GAC
- C++语言中的多态
- java基础第二天课程总结
- 那些值得你去细细研究的Drawable适配(下)
- iOS 集合的深复制与浅复制
- Java实现-高效排序算法之Shell排序
- Linux 常用命令汇总
- iOS开发——超链接富文本
- hdu 2523 水
- Android视频播放器中的播放与暂停
- 大数据流式处理的利与弊
- Laxcus大数据管理系统2.0(14)- 后记
- FPGA:下一代机器人感知处理器
- Laxcus大数据管理系统2.0(13)- 总结
- Laxcus大数据管理系统2.0(12)- 第十章 运行
- Laxcus大数据管理系统2.0(11)- 第九章 容错
- JSP标签库大全jsp常用的指令与标签