快速排序这个思想因其时间复杂度O(N*logN)效率较高,算法容易理解,故面试时候时常有考察到,对于递归和分治的思想也是个促进。
算法思想:挖坑填数 + 分治
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
// 简而言之:找准自己的位置
假设是从小到大排列:
找的思想就是 用两个指针,一个指针从前向后的搜索,另一个从后往前搜索,遇到比S[0] 大的丢到后面,比S[0]小的丢到前面去。X=S0
具体操作:
1. j 从 r 开始,遇到比si小的停下来,把该数填到i的位置 SI=SJ I++(注意,1 2 步骤不能反过来)
2.i 从l 扫描,遇到比sj大的则停下来,把该数填到j的位置 SJ=SI J--
3. 重复1 2 操作,直到 i=j 则此时 SJ就是X的位置
如:
0 1 2 3 4 5 6 7 8 9
72 6 57 88 60 42 83 73 48 85
第一遍 48 6 57 88 60 42 83 73 48 85(48填了第0个坑)
int findMyPosition(int s[], int l, int r) { int i=l,j=r; int X=s[l]; while (i<j) { while(i<j && s[j] >= X) {//从右向左找小于x的数来填s[i] j--; } if (i<j) { s[i]=s[j];// i++; } while(i<j && s[i]<X) { // 从左向右找大于或等于x的数来填s[j] i++; } if (i<j) { s[j]=s[i]; j--; } } s[i]=X; return i; } //用分治法对其他的排序 void quickSort(int s[],int l, int r) { if (l < r) { int i= findMyPosition(s, l, r); quickSort(s, l, i-1);// 递归调用排前面的数的序 quickSort(s, i+1,r); } }
以下是两个函数的整合
void quick_sort1(int s[], int l, int r) { int i=l,j=r; int X=s[l]; if (i<j) { while (i<j) { while(i<j && s[j] >= X) {//从右向左找小于x的数来填s[i] j--; } if (i<j) { s[i]=s[j];//填充 i++; } while(i<j && s[i]<X) { // 从左向右找大于或等于x的数来填s[j] i++; } if (i<j) { s[j]=s[i]; j--; } } s[i]=X; quick_sort1(s, l, i-1); quick_sort1(s, i+1, r); } }
测试函数
1 int main(int argc, const char * argv[]) 2 { 3 4 @autoreleasepool { 5 int s[]={1,334,5,53,3,63,646,6,47,56}; 6 quick_sort1(s, 0, 10); 7 // quickSort(s, 0,10); 8 for (int i=0; i<10; i++) { 9 printf("%d ",s[i]); 10 } 11 12 } 13 return 0; 14 }
测试结果:
概念引文地址:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html