快速排序算法思想与实现
快速排序这个思想因其时间复杂度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
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号