快速排序的实现

简介:快速排序通常是实际排序应用中最好的选择,因为它的性能非常好:其期望时间复杂度为   nlgn  ;
而且隐含的常数因子非常小,另外,它还能进行原址排序,甚至在虚存环境中也能很好
地工作.

特点:
    1.最坏情况的时间复杂度:n^2;(发生在)
	2.期望时间复杂度:      nlgn;
	3.原址排序
	
没有什么特殊的输入会导致最坏情况的发生!
注意:lgn是以2为底

方法:分治思想
     a,分解
	 b,解决
	 c,合并(因为是原址,所以不用合并了)
	 
实现:
//分区函数,可以把数据分成两部分,分界点就是排好的点
int partition(int a[], int p, int r)
{
    int x = a[r];
	int i,j;
	
	i = p - 1;
	for (j = p; j < r; ++j)
	{
	    if (a[j] < x)
		{
		    i++;//i是所以小于x的边界坐标,包括i,而i+1到j-1则是大于等于x的元素,j是当前要归类的元素
			exchange(a + i, a + j);
		}
	}
    exchange(a+i+1, a+r);//把分类的主元放在分界点上,其左边是比其小的,右边是大于或等于其值的	
   
    return i+1;//返回分界点下标
}


void quick_sort(int a[], int p, int r)
{
   int q;
   if (p < r)
   {
        q = partition(a,p,r);
		quick_sort(a, p, q-1);
		quick_sort(a, q+1, r);
   }
}




//因为快排与输入数据的排列有关,如果是有序的,那么其性能会很差,所以,引入随机快排算法

/************************************************************************/
/* 快速排序随机化版本                                                   */
/************************************************************************/
//思想是:每次选择主元时都是随机选取的,而不是固定取最后一个元素


int Random(int a, int b)  
{  
	int i;  
	int ram = a;  

	for (i = 0; i < b-a; i++)  
	{  
		ram += rand()%2;//从起点做累加就可以了,其中rand()%2返回0或1  
	}  


	return ram;  
}
int randomized_partition(int a[], int p, int r)
{
	int i= Random(p,r);
	exchange(a+i, a+r);
	return partition(a,p,r);
}

void randomized_quick_sort(int a[], int p, int r)
{
	int q;
	if(p < r)
	{
		q = randomized_partition(a,p,r);
		randomized_quick_sort(a, p, q-1);
		randomized_quick_sort(a, q+1, r);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值