快速排序(QuickSort)

来源:互联网 发布:喜马拉雅有mac版吗 编辑:程序博客网 时间:2024/05/21 09:18

快速排序的基本思想:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

其中,每一趟快速排序的过程可以理解为挖坑填数,过程如下:
1.i =left; j = right; 将基准数挖出形成第一个坑a[i]。
2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

代码如下:

//QuickSort.c#include <stdio.h>//打印数组void PrintArray(int array[],int n){    int i;    for(i = 0;i < n;i++)        printf("%-3d",array[i]);    printf("\n");}//返回划分后被定位的基准记录的位置int Partition(int array[],int left,int right){    int i,j,temp;    i = left;    j = right;    temp = array[i];            /*初始化,temp为基准*/    do{        while((temp <= array[j]) && (i < j))            j--;        /*从右往左查找第一个关键字小于temp记录*/        if(i<j)             array[i++] = array[j]; /*交换array[i]与array[j]*/            /*array[i] = array[j];            i++;            */        while((temp >= array[i]) && (i<j))            i++;        /*从左向右查找第一个关键字大于temp记录*/        if(i<j)            array[j--] = array[i];/*同上*/    }while(i != j);    array[i] = temp; /*基准temp已被最后定位*/    return i;}//快速排序,对array从left到right进行快速排序void QuickSort(int array[],int left,int right) {    int i;    if(left<right){ /*只有一个记录或无记录时无需排序*/        //对array[left]到array[right]划分        i = Partition(array,left,right);        //递归处理左区间        QuickSort(array,left,i - 1);        //递归处理右区间        QuickSort(array,i + 1,right);    }} void main(){    int array[8]={1,9,4,3,7,2,8,5};    QuickSort(array,0,7);    PrintArray(array,8);}
0 0