算法概述:
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法介绍:
假设需要排序的数组是A[low]……A[high],通常选取第一个元素作为关键值,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
算法过程
- 设置两个变量i、j,排序开始的时候:i=low+1,j=high-1;
- 先判断i是否小于j,如果是:从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于A[low]的A[i],再从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于A[low]的A[j]。
- 再判断i是否小于j,如果是:交换A[i]和A[j]的值。
- 交换A[j]和A[low]的值.
- 递归调用上述过程。(注意:此时数组分为两部分,调用分两次。第一部分的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;
第一趟排序:
- 执行过程2:第一个大于A[low]的是A[1]值为5(i=1),第一个小于A[low]的是A[2]值为2(j=2);
- 执行过程3:交换A[1]和A[2]的值。此时数组为:A[5]={3,2,5,6,4};
- 执行过程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);
}