快速排序算法由Charles Antony Richard Hoare(又称Tony Hoare 或 C. A. R. Hoare)于1962年提出,文章发表在Computer Journal上。C. A. R. Hoare 1934年1月11日出生于锡兰(现斯里兰卡)科伦坡。同时他还提出了Hoare逻辑(用于验证程序的正确性)和一种形式化语言CSP(Communicating Sequential Processes,用于指定并发进程间的交互顺序),并对occam编程语言的出现产生了重要影响。
快速排序利用了分治的思想,将一个复杂的问题分解为一个个小的子问题,并迭代的对子问题继续进行分解,直到分解后的子问题都有方法解决。具体来说,对一个整型数组,先选定一个基准值,通常选第一个,也可以随机选取,然后从数组尾端开始逐一与此基准值进行比较,如果尾端的值大于等于基准值,则将尾端序号减一,再继续比较,否则将尾端值与头端值交换位置,再从头端开始逐一与基准值进行比较,如果头端的值小于等于基准值,则将头端序号加一,再继续比较,否则将头端值与尾端值交换位置,再转到尾端开始比较,如此往复,直到头端序号等于尾端序号。至此,一趟排序完成,次时,基准值位于数组中间,它之前的数都小于等于它,它之后的值都大于等于它。再迭代的对前后两个子数组进行同样的操作,当所有的子数组都排好序后,整个数组也就有序了。
快速排序之所以比冒泡排序效率高,是因为一趟排序后,基准值之前的所有数都小于基准值之后的,所以在之后的排序过程中,前面子数组的数都不需要再与后面子数组里的数进行比较,大大地减少了比较次数。
用DEV C++写的代码如下:
#include<stdio.h>
#include<stdlib.h>void quickSort(int *p,int m,int n)
{
if(n<=m) return;
int low=m,high=n,temp=p[low];
while(low < high)
{
while(p[high]>=temp && low<high) high--;
p[low]=p[high];
while(p[low]<=temp && low<high) low++;
p[high]=p[low];
}
p[low]=temp;
quickSort(p,m,low-1);
quickSort(p,low+1,n);
}
int main()
{
int a[] = {50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31};
quickSort(a,0,19);
for(int i=0;i<20;i++)
printf("%d\n",a[i]);
system("pause");//需要头文件stdlib.h,非DEV C++的编程环境不需要此行代码
return 0;
}