快速排序
来源:互联网 发布:source linux命令 编辑:程序博客网 时间:2024/05/16 02:31
快速排序
1、算法思想:
主要是你要找到一个基准,将数组分成两半,左边的全部小于基准值key右边的全部大于基准值key,这样就可以将数组分成两半,采用分治的思想,减少了算法的复杂度
2、实现方法:
第一步:从右往左找,找到第一个小于key的数
第二步:从左王右找,找到第一个大于key的数
第三步:前两步,完成之后,交换他们的值
第四步:将key的值放在中间
第五步:利用递归的方式进行实现排序
注*这里要说明的问题是swap(int a, int b)在交换中容易出现的错误 如果a没有值的话,(值定义一个 int a=Q[e] ) b有一个切确的值5 在这里是不能整场交换的
所以要采用swap(int * a,int *b); 去交换他们的地址,这样才能正常完成交换,达到你所需要的功能
3、复杂度分析(最好的请况)
首先:将数组分成log(n)层,,但是每一层都要调用n次 那么则是nlog(n)次 复杂度为O(nlog(n));
4、源代码( 这里提供算法导论版本的)
#include<iostream>#include<ctime>#include<cstdlib>using namespace std;void swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp;}int partion(int a[], int p, int r){ int i, j ; srand((unsigned)time(NULL)); int e = rand()%(r-p+1) + p; swap(&a[e], &a[r]); int key = a[r]; i = p-1; for(j = p; j < r; j++) { if(a[j]<=key) { swap(&a[i+1],&a[j]); i++; } } swap(&a[i+1], &a[r]); return i+1;}void QuickSort(int a[], int p, int r){ //这个条件是因为 if(p <r) { int q = partion(a, p, r); QuickSort(a, p, q-1 ); QuickSort(a, q+1,r); }}int main(){ int array[]={0,-2,11,-4,13,-5,14,-43}; QuickSort(array,0,7); for(int i=0;i<=7;i++) cout<<array[i]<<" "; cout<<endl; return 0; }
还有Hoare版本。。。。。。。。
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- Erlang学习总结
- 算法:回溯算法
- Oracle DB 使用资源管理
- arch linux root 自动登录
- 分享Unity3d的消息机制实现
- 快速排序
- Codeforces Round #203 (Div. 2)B
- windows7 x64位内python3.3.2下导入模块xlwt3 v0.1.2出错解决方法
- 了解iOS中XML解析
- java界面编程把界面放在屏幕中央的方法
- Oracle之sql标准之连接查询汇总
- 客户需求与设计的差距
- 大学生的精神生活
- 你有觉得自己很傻么?