快速排序

引用百度百科:

 


思想:

简单的说(按从小到大排序示例),就是先找一个基准值(一般是第一个数),设置两个“指针” i 和 j 。j 从数组的最后一位开始往前遍历,当“指针”所指的数小于基准值时,j 不再移动; i 开始从前往后遍历,当 i 所指向的值大于基准值时,交换 i,j 指针所指值,然后再次重复此过程。直到 i == j 的时候,退出循环。此时将基准值与 i,j (i == j)的位置互换,这个位置就是基准值在排序后的最终位置。(因为基准值前面的数都不大于它,后面的值都不小于它)

最后拆分数组,将基准值前面的数组和后面的数组再次按上述处理。

 

快速排序是不稳定的排序方法
最优时间复杂度是 O(nlogn)
最差时间复杂度是 O(n2)
期望时间复杂度是 O(nlogn)


public class Quicksort {

	public static void main(String[] args) {
		int[] arr = {4,1,5,2,2,7,5,6,0,9};
		int len = arr.length;
		
		//从小到大快速排序
		quickSort(arr, 0, len-1);
		
		for(int i=0; i<len; i++) {
			System.out.print(arr[i]+" ");
		}
		System.out.println();
	}

	private static void quickSort(int[] arr, int l, int r) {
		if(l >= r) return ; //只有一个元素或不合法时返回
		
		int i = l;
		int j = r;
		int key = arr[l]; //基准值
		while(i < j) {
			while(i < j && arr[j] >= key) //从后开始往回找
				j --;
			while(i < j && arr[i] <= key)
				i ++;
			if(i < j)
				swap(arr, i, j);
		}
		swap(arr, i, l); //基位确定最后的位置(i == j),之后基准位不再参与排序 
		
		quickSort(arr, l, i-1);
		quickSort(arr, i+1, r);
	}
	
	private static void swap(int[] arr, int i, int j) {
		int t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}

}

 如有错误或不合理的地方,敬请指正!

加油!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值