快速排序是分治法的典型应用,它的大概的一个实现思路是:任意去一个数,将比它大的数放在该数右边,比它小的数放在它左边(反过来也行)。然后又将左右两边的数进行该操作,直到只剩下一个数了,也就不用排序了。我们看下代码:
#include<stdio.h>
//这里交换值
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
//快排函数
void QuickSort(int a[],int left,int right)
{
int key,i,j;
//我们让这个关键数为最左边的数
key=a[left];
i=left;j=right;
//当只有一个数时不用排了
if(left>=right)
return;
while(i!=j)
{
while(j>i&&a[j]>key)
j--;
swap(a[i],a[j]);
while(j>i&&a[i]<key)
i++;
swap(a[i],a[j]);
}
QuickSort(a,left,i-1);
QuickSort(a,i+1,right);
}
int main()
{
int i;
int a[]={2,5,8,4,69,31,94,82,76};
QuickSort(a,0,8);
for(i=0;i<9;i++)
printf("%d ",a[i]);
return 0;
}
这里说明一点点,我们的平均时间复杂度是 O(nlog n)我们都是取最左边的数为关键值,但是会有个缺点,如果我们的数组本来就是排好序的,那么会使得左边永远没有二分进去,这就使得只有右边这一部分在工作,所以复杂度又回到O(n^2).这里有个办法就是,先随机打乱再使用快排就是 O(nlog n)了。每星期几道算法,我相信日积月累。