基础算法学习——快速排序

快速排序是分治法的典型应用,它的大概的一个实现思路是:任意去一个数,将比它大的数放在该数右边,比它小的数放在它左边(反过来也行)。然后又将左右两边的数进行该操作,直到只剩下一个数了,也就不用排序了。我们看下代码:

#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)了。每星期几道算法,我相信日积月累。

猜你喜欢

转载自blog.csdn.net/cj151525/article/details/84452026
今日推荐