快速排序属于交换类排序,通过多次划分操作实现排序。以升序为例,每一趟选择当前所有子序列的一个关键字(通常为第一个),作为枢纽,将子序列中比枢纽小的的移到枢纽的前边,比枢纽大的移到枢纽的后边,当本趟所有子序列都被枢纽以上述规则划分完毕后会得到新的一组更短的子序列,他们成为下一趟划分的初始序列集
#include<stdio.h>
void Quicksort(int a[],int low,int high)
// 从a[low]到a[high]的关键字进行排序
{
int temp;
int i=low,j=high;
if(low<high)
{
temp=a[low];
//下面这个循环完成了一趟排序,即将数组中小于temp的值放在左边,大于temp的值放在右边
while(i<j)
{
while(i<j&&temp<a[j])//从右到左扫描,找到一个小于temp的值
--j;
if(i<j)
{
a[i]=a[j];//交换,并i右移一位
++i;
}
while(i<j&&temp>a[i])//从左到右扫描,找到一个大于temp的值
++i;
if(i<j)
{
a[j]=a[i];//交换,并j左移一位
--j;
}
}
a[i]=temp;//将temp放在最终的位置上
Quicksort(a,low,i-1);//递归的对temp左边的序列进行排序
Quicksort(a,i+1,high);//递归的对temp右边的序列进行排序
}
}
int main()
{
int a[5]={4,7,9,2,5};
Quicksort(a,0,4);
for(int i=0;i<5;i++)
printf("%d",a[i]);
return 0;
}
快排在最好的情况下时间复杂度为O(nlog2n),待排序列越无序,算法效率越高,最坏情况下为O(n2),平均情况下为O(nlog2n),空间复杂度为O(log2n)