快速排序

定义

快速排序采用递归的思想,不断将原列表拆分成两个部分,递归进行排序。排序操作为选择一个元素作为“分水岭”,将列表分成所有元素值大于该“分水岭”部分和所有元素值小于该“分水岭”部分。

示例

以整型数组{2,9,11,5,7,20,8}为例,选择第一个元素作为“分水岭”,以line表示:

原始列表:2->9->11->5->7->20->8  line=2

1次排序:2->9->11->5->7->20->8 line=9

2次排序:2->8->7->5->9->20->11 line=8

3次排序:2->5->7->8->9->20->11   line=5

4次排序:2->5->7->8->9->20->11   line=20

5次排序:2->5->7->8->9->11->20

以上为排序中间过程,递归中以列表左边部分先排序,同一颜色为拆分后的同一部分。

参考代码

class t{
	public static void main(String[] args){
		int[] arr=new int[]{2,9,11,5,7,20,8};
		QuickSort.sort(arr,0,arr.length-1);
		for(int i:arr){
			System.out.print(i+" ");
		}
		System.out.println();
	}
}
class QuickSort{
	public static void sort(int[] arr,int left,int right){
		if(left<right){  //递归判断条件
			int i=left,j=right,index=arr[i];  //index作为“分水岭”
			while(i<j){
				//列表后端保存大于index的值,前端保存小于index的值
				while(i<j&&arr[j]>=index){
					j--;
				}
				if(i<j){
					arr[i++]=arr[j];
				}
				while(i<j&&arr[i]<=index){
					i++;
				}
				if(i<j){
					arr[j--]=arr[i];
				}
			}
			arr[i]=index;//到达该步骤时,i必然等于j
			sort(arr,left,i-1);//递归操作列表前端
			sort(arr,i+1,right);//递归操作列表后端
		}		
	}
}

总结

快速排序将无序的列表拆分成“有序”的两个部分,使得整个列表成为包含两个“有序”部分的列表(一部分的元素值都不小于或不大于另一部分的元素值),并不断细化这些“有序”部分,最终形成有序列表。平均时间复杂度为O(n*log n),因为存在跨元素的替换,属于不稳定排序。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值