快速排序

算法思想:快排是采用的分治思想。一般取第一个元素为基准,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准要小,另一部分数据都比基准要大,然后用同样的方法对着两部分数据分别进行快排,快排使用递归思想,直至整个数列变为有序数列。

时间复杂度:n*logn(平均时间复杂度)

空间复杂度:O(1)

是否是稳定排序:不是稳定排序

代码示例:

 

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10

int  GetPartition(int a[], int low, int high)
{
	int ret = -1;
			
	ret = (a != NULL)&&(low >= 0)&&(high > 0)&&(low < high);
	
	//以Temp为基准,比Temp大的放Temp右边,比Temp小的放Temp放左边 
	int Temp = a[low];
	
	if(ret)
	{
	
		while(low < high)
		{	//从右向左找一个比Temp小的值  填到空出来的a[low]处 
			while( (low < high)&&(a[high] >= Temp) )
			{
				high--;
			}
			
			if(low < high)
			{
				a[low] = a[high];//找到一个比Temp小的,放到空出来的a[low]位置 
				low++;
			}
			
			//从左向右找一个比temp大的值 填到空出来的a[high] 里面去 
			while( (low < high)&&(a[low] < Temp) )
			{
				low++;
			}
			
			if(low < high)
			{
				a[high] = a[low];//找到一个比Temp大的,放到上面刚空出来的a[high]位置 
				high--;
			}
		}
	}
	
	//将Temp放入恰当的位置 
	a[low] = Temp;
	//当low = high时第一趟排序结束,Temp左边都是比Temp大的,Temp右边都是比Temp小的 	
	ret = low; 
	
	return ret; //返回middle值 
}

int QuickSort1(int a[], int low, int high)
{
	int ret = -1;
	int middle = 0;
		
	ret = (a != NULL)&&(low >= 0)&&(high >= 0)&&(low < high);
	
	if(ret)
	{		
		middle = GetPartition(a, low, high);
		QuickSort1(a,low,middle-1);
		QuickSort1(a,middle+1,high);
	}
	
	return ret; 
}

int PlayFunc(int *a, int n)
{
	int i = 0;
	int ret = -1;
	
	ret = (a != NULL)&&(n > 0);
	
	if(ret)
	{
		printf("Array[]:");
		for(i = 0; i < n; i++)
			printf("%d, ", a[i]);
		printf("\n");
	}
	
	return ret;
}

void main()
{
	int array[SIZE] = {8,5,10,7,6,9,4,3,2,1};

	PlayFunc(array, 10);
	
	QuickSort1(array, 0,9);
		
	PlayFunc(array, 10);
	
}

 

 

 

 

 

运行效果截图:

 

这里贴出一篇博文链接,也是写快速排序的,分析的相当到位:点击打开链接

我自己也是看了这篇文章然后自己撸出来的代码,代码都差不多,但是觉得他分析快速排序的思路很好,根据思路再写出代码就很容易了。

同样,快速排序一样可以优化,待续...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值