设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=low-1,j=low;
2)以第最后一个数组元素作为关键数据,赋值给
key,即
key=A[high];
3)从j开始向前搜索,即由后开始向前搜索(j++),找到第一个小于
key的值A[j],将A[j]于A[i]交换,i++;
4) 从j继续往前搜索直到high-1,将i+1的值与可key交换。
/*
============================================================================
Name : quick_sort.c
Author : braveboyny
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include<stdio.h>
int partition(int array[],int low,int high)
{
int i,j,key,temp;
key=array[high];/*以key值作为参考将数组划分成大于key和小于key的2部分*/
i=low-1; /*以i作为边界,小于key的放在i(包括i)左边,大于key的放在在i右边
*初始默认都大于key*/
for(j=low;j<high;j++){
if(array[j]<=key){
i=i+1; /*若array[j]<=key,则将array[i+1]与array[i]交换,
*因为i是边界所以i+1代表的数绝B大于key,这样就将小于key的值放在了i左边*/
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
temp=array[i+1];
array[i+1]=array[high];
array[high]=temp;/*最后将大于key的array[i+1]于key也就是array[high]交换
* 这样分组就圆满完成了*/
return i+1;
}
void quick_sort(int array[],int low,int high)
{
int k;
if(low<high){
k=partition(array,low,high);
quick_sort(array,low,k-1);
quick_sort(array,k+1,high);
}
}
int main(int argc,char *argv[])
{
int array[10]={8,2,3,6,5,9,4,1,0,7},i;
quick_sort(array,0,9);
for(i=0;i<10;i++)
printf("%d ",array[i]);
putchar('\n');
return 0;
}
//out:0 1 2 3 4 5 6 7 8 9