快速排序算法思想与实现

快速排序这个思想因其时间复杂度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);        
    }
}
View Code

测试函数

 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 }
View Code

测试结果:

概念引文地址:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html

 
 
原文地址:https://www.cnblogs.com/nonato/p/3169917.html