代码
#include <stdio.h>
#define SIZE 10
void quicksort(int *a, int left, int right)
{
if(left > right)
return;
int key = a[left];
int i = left;
int j = right;
while(i < j)
{
while(i < j && key <= a[j])
j--;
while(i < j && key >= a[i])
i++;
if(i<j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left] = a[i];//将i与j相遇的位置的数放到key哨兵位置
a[i]=key;//i与j相遇的位置放上该哨兵key
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
int main()
{
int number[SIZE] = {6,1,2,5,4,3,9,7,10,8};//{95, 45, 15, 78, 84, 51, 24, 12};
quicksort(number, 0,SIZE-1);
for (int i = 0; i < SIZE; i++)
{
printf("%d ", number[i]);
}
printf("\n");
}
简单解析
快速排序的基本思想是:选出一个哨兵key,原则上随意取,我们取为运行集的第一个值,在一次运行中,我们先从右面寻找小于哨兵key的值的位置,然后从左面找到大于哨兵key的值的位置,将这两个位置进行交换,运行多次该操作,最后i,j相遇,相遇的位置的数肯定小于哨兵key,将该数与哨兵key交换,我们看到哨兵key右面的值都大于哨兵key,左边的值都小于哨兵key。然后通过分治的思想,哨兵左边的元素运行一次,哨兵右面的元素运行一次。