快速排序

void quickSort(int k[ ],int left,int right) 
{     				//left代表需要排序的那段数字的起始位置,right则代表终止位置
    int i, last;		//last始终代表已经排序好的数字段的最后一个,一次排序结束,last是分界数字,
    if(left<right)
   {				//如果left>=right排序完成终止
        last=left; 
        for(i=left+1;i<=right;i++)
        {			//将起始位置当作分界数,从下一个数字开始搜索
	  if(k[i]<k[left])	//降序排序则是'>'
                swap(&k[++last],&k[i]); //一个交换函数
    	}
	swap(&k[left],&k[last]);	//将分界数换至分界位置上
        quickSort(k,left,last-1); 	//递归,将分开的两段继续排序
        quickSort(k,last+1,right);   
    }
}

void swap(int *i,int *j)
{
	int t;
	t=*i;
	*i=*j;
	*j=t;
}
解读:快速排序是将第一个数作为分界数,将小于它的数全部放到一边而不管顺序,大于它的数则放到另一边,
递归下去,则最终实现排序。
相关知识:选择排序的时间复杂度为O(n^2),适用于n较小的情况
快速排序是选择排序的改进,时间复杂度为O(nlogn),最坏情况退化为选择排序时间复杂度为O(n^2)
适用于n较大的情况
改进:调整分区,以下代码将数组分为两区,可以改进分为更多区
相关:三路基数快排、随机化快排、平衡快排、外部快排、三平均分区法


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值