快速排序

快速排序核心思想:从数列中取出一个数作为基准数。将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

再进行递归,最后只有三个数,即基准数左右都只剩下一个数。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤总结:

1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。

2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。

3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。

4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

 

/*
 * Quick.c
 *
 *  Created on: 2017年4月18日
 *      Author: zzd
 */

#include<stdio.h>
#include<stdlib.h>
void Quick(int a[],int l,int n)
{
    if(l<n)
    {
        int i=l,j=n,x=a[l];
        while(i<j)
        {
            while(i<j&&a[j]>=x){j--;} //从右到左找第一个小于X的数

            if(i<j){a[i++]=a[j];}

            while(i<j&&a[i]<x){i++;}//从左到右找第一个大于X的数

            if(i<j){a[j--]=a[i];}
        }
        a[i]=x;
        Quick(a,l,i-1);
        Quick(a,i+1,n);
    }

}
int main()
{
    int b[10]={1,546,8,3,26,45,789,125,645,22};
    Quick(b,0,9);
    for(int o=0;o<10;o++) printf("%d\n",b[o]);
    return 0;
}


// 详细版
int quickSortPartition(int array[], int low, int high) {
    
    int i = low, j = high;
    
    // 将第一个元素作为哨兵
    int sentry = array[i];
    
    while (i < j) {
        
        // 从右往左找第一个小于哨兵的元素
        while (i < j && array[j] >= sentry) {
            j--;
        }
        
        if (i < j) {
            array[i] = array[j];
            i++;
        }
        
        // 从左往右找第一个大于哨兵的元素
        while (i < j && array[i] <= sentry) {
            i++;
        }
        
        if(i < j) {
            array[j] = array[i];
            j--;
        }
    }
    
    // 把哨兵放在 i == j 处
    array[i] = sentry;
    
    // 返回哨兵的位置
    return i;
}

void quickSort(int array[], int low, int high) {
    if (low < high) {
        
        // 分界点
        int partition = quickSortPartition(array, low, high);
        // 递归实现
        quickSort(array, low, partition - 1);
        quickSort(array, partition + 1, high);
    }
}
// 简洁版
void quickSort1(int array[], int low, int high) {
    
    int i, j, temp;
    i = low;
    j = high;
    temp = array[low];
    
    if (low > high) {
        return;
    }
    
    while (i != j) {
        
        // 从右往左找第一个小于哨兵的元素
        while (i < j && array[j] >= temp)
            j--;
        
        if (j > i)
            array[i++] = array[j];
        
        // 从左往右找第一个大于哨兵的元素
        while (i < j && array[i] <= temp)
            i++;
        
        if (j > i)
            array[j--] = array[i];
    }
    
    array[i] = temp;
    quickSort1(array, low, i - 1);
    quickSort1(array, i + 1, high);
}

 

参考:

https://www.jianshu.com/p/a4c589136e2b

https://blog.csdn.net/MoreWindows/article/details/6684558


posted @ 2017-09-04 17:21  小时候挺菜  阅读(103)  评论(0编辑  收藏  举报