ACM_快速排序算法
来源:互联网 发布:诸神黄昏坐骑进阶数据 编辑:程序博客网 时间:2024/05/21 14:58
每次以数组第一个数为基数,从数组两端往中间找,小于基数的数放在数组的左边,大于它的数放在数组的右边,当i == j的时候,查找结束,将基数赋值到这个位置,这个数在数组中的位置就是这个,确定了。然后从这个数的左边和右边开始递归,直到所有的数都排完序。
时间复杂度:nlog2n(最好,平均)、n2(最坏)
时间复杂度:nlog2n(最好,平均)、n2(最坏)
#include<cstdio>#include<iostream>using namespace std;void sort(int ri[],int l,int r){ if (l < r) { int i = l , j = r , x = ri[l];//x = ri[l],不是 x = ri[1] while (i < j) // i == j 的时候,这次查找就结束了 { // while里面的循环都必须保证i < j while (i < j && ri[j] >= x) { --j; } if (i < j)//如果没有这条语句直接赋值的话,倘若上面while结束循环的条件是i = j,那么接下来的赋值就会出错 { ri[i++] = ri[j]; } while (i < j && ri[i] < x) { ++i; } if (i < j) { ri[j--] = ri[i]; } } ri[i] = x; // 将基数赋值到这个位置 sort(ri,l,i-1); // 从i位置的左边开始递归,由于i位置的数已经确定,所以本次递归右边的数是从i-1开始的 sort(ri,i+1,r); // 同上 } return ;}int main(){ int i,n,ri[100]; while (~scanf("%d",&n)) { for (i = 0; i < n; ++i) scanf("%d",&ri[i]); sort(ri,0,n-1); for (i = 0; i < n; ++i) printf("%d ",ri[i]); printf("\n"); } return 0;}
0 0
- ACM_快速排序算法
- ACM_归并排序算法
- ACM_快速幂
- ACM_拓扑排序
- ACM_扩展欧几里德算法
- ACM_模板_Tarjan算法
- ACM_模板_KMP算法
- ACM_模板_Manacher算法
- ACM_扩展欧几里得算法
- ACM_算法_Lucas定理
- acm_随机算法
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- iOS开发系列--地图与定位
- Cocos2d-x Vector——vector iterators incompatible
- linux awk命令详解
- LatinIME中几个主要方法说明
- LuaBridge
- ACM_快速排序算法
- 1323: 算法2-1:集合union
- 2012年5月SAT香港真题解析
- JAVA开发 - Spring MVC学习
- windows下opencv的环境配置,kinect sdk的安装以及属性表配置
- 最大流模板(学习中)
- 解决视频直播P2P过程中接收端无声音问题
- HDU 2047 阿牛的EOF牛肉串
- ubuntu 配置 java jdk1.8 环境,增加多版本 jdk 和切换方法