快速排序算法

算法概述:

快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法介绍:

假设需要排序的数组是A[low]……A[high],通常选取第一个元素作为关键值,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

算法过程

  1. 设置两个变量i、j,排序开始的时候:i=low+1,j=high-1;
  2. 先判断i是否小于j,如果是:从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于A[low]的A[i],再从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于A[low]的A[j]。
  3. 再判断i是否小于j,如果是:交换A[i]和A[j]的值。
  4. 交换A[j]和A[low]的值.
  5. 递归调用上述过程。(注意:此时数组分为两部分,调用分两次。第一部分的high为j;第二部分的low为j+1。
    例如:QuckSont(A,low,j); QuckSont(A,j+1,high);

示例

假设排序数组为A[5]={3,5,2,6,4};
low=0;
high=5;
i=low+1=1;
j=high-1=5;
第一趟排序:

  1. 执行过程2:第一个大于A[low]的是A[1]值为5(i=1),第一个小于A[low]的是A[2]值为2(j=2);
  2. 执行过程3:交换A[1]和A[2]的值。此时数组为:A[5]={3,2,5,6,4};
  3. 执行过程4:交换A[low]和A[j]的值。此时数组为:A[5]={5,2,3,6,4}。

代码实现

#include<stdio.h>
void QuckSont(int Date[],int low,int high){
    int i,j,t;
    if(high-low>1){
        i=low+1;
        j=high-1;
        while(i<j){
            while(Date[i]<=Date[low]) i++;
            while(Date[j]>Date[low]) j--;
            if(i<j){
                t=Date[i];
                Date[i]=Date[j];
                Date[j]=t;
            }
        }
        t=Date[low];
        Date[low]=Date[j];
        Date[j]=t;
        QuckSont(Date,low,j);
        QuckSont(Date,j+1,high);
    }
}
void printf(int date[],int low,int high){
    int i;
    for(i=low;i<high;i++)
    printf("%5d",date[i]);
}
int main(void){
    int Date[9]={1,9,0,3,6,7,4,8,5};
    QuckSont(Date,0,9);
    printf(Date,0,9);
}
点赞