快速排序

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

/*
 * 快速排序就是先选定一个基准值(参考值,你随便叫)
 * 然后通过从两头遍历发现符合条件的就赋值交换,直到该基准值的两边
 * 一边的元素都大于基准值,一边的元素都小于基准值
 * 这样通过多次递归,就可以实现排序功能
 */
public class Q {
	static void fun(int []a,int low , int high){
		// 左边的下标不能大于等于右边的下标,(跑过了)
		if(low>=high){
			return;
		}
		int i=low; //左边开始
		int j=high; // 右边开始
		
		int key = a[low]; //选的基准值,你随便选,一般都是左边,中间和右边
		//while循环在不停的进行以key为分割线的分割操作
		while( i<j ){
			while(i<j && key <= a[j]){
				j--;
			}
			a[i] = a[j];
			
			while(i<j && key >=a[i]){
				i++;
			}
			a[j] = a[i];
		}
		a[i] = key;             //最后确定基准值的位置
		fun(a,low,i-1);  //基准值的左边递归
		fun(a,i+1,high); //基准值右边递归
	}
	
	public static void main(String[] args) {
		int arr[] = {6,3,2,1,5,4,9,7,10,8};
		fun(arr,0,arr.length-1);
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]+" ");
		}
	}
}

快速排序平均时间复杂度是O(N*logN)。最好也是O(N*logN),但最环情况是O(N^2)。

最坏情况为每次都把数据分成N-1个数和1个数,每一次循环完了都是1,,,,,;1,2,,,,,;1,2,3,,,,,这样就和插入、选择时间复杂度一样了。所以我们在选取基准值的时候,还是要尽量选取大小位于中间的值,这样速度最快。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值