java快速排序

1、此算法平均时间复杂度:O(nlog2n)

是目前基于比较的内部排序中被认为是最好的一种排序算法。当待排序的关键字是随机分布时,快速排序的平均时间最短。

2、空间复杂度:O(log2n)

3、不稳定排序算法


下面举例说明为何快速排序是一种不稳定排序算法:

0 1 2 3 4 5 6(位号)

4 2 1 6 3 5 3

支点=4

此时先4和3比较,于是3放到0号位

支点再和2、1比较,都小于4,所以2、1位置不变。

支点和6比较,小于6,所以将6放到了6号位(此号位上的3被移到了0号位),将4放到3号位。

一轮下来的结果:3 1 2 3 4 5 6

此时,两个相等数3的相对位置就变换了,所以称此算法为不稳定算法。


具体代码:

import java.util.Arrays;

public class QuickSort {

	/**
	 * 快速排序
	 * 
	 * 思路:
	 * 1、目标支点定位:拿初始支点和两端数据交替的进行比较。
			每一轮adjust()下来,目标支点左边的数值比支点小,右边的数值大于等于支点。
	 * 2、左右再分别进行目标支点的定位。
	 * 
	 * 全部目标支点都找到时,即排序完成。
	 * 
	 */
	public static void main(String[] args) {
		int[] arr = {3,1,3,2,4,2,3};
		sort(arr, 0, arr.length-1);
		//sort(arr, arr.length-1, 0);
		System.out.println(Arrays.toString(arr));
	}

	public static void sort(int[] arr, int low, int high) {
		if(low < high) {//low>=high的情况无意义		
			int pivotPosition = adjust(arr, low, high);//支点定位
			sort(arr, low ,pivotPosition-1);//支点左边递归定位
			sort(arr, pivotPosition+1, high);//支点右边递归定位
		}
		
	}
	
	//支点定位
	public static int adjust(int[] arr, int low, int high) {
		int pivot = arr[low];//初始支点为low位上数
		while(low < high) {
			while(low<high && compare(pivot, arr[high]) <= 0) {	//支点和高位比,比高位小,就high自减继续比。
				high--;	
			}
			
			arr[low] = arr[high];	//支点比高位大时,就将高位放到low位
			
			while(low<high && compare(pivot, arr[low]) > 0) {	//再将支点和低位比较,比低位数大,low 自增继续比
				low++;
			}
			
			//找到比支点大的低位,就将此低位数放到此时的high位上。
			arr[high] = arr[low];
			arr[low] = pivot;//将支点放在此时的low位置
		}
		System.out.println("支点:"+arr[low]);
		return low;
	}
	
	//数值比较
	public static int compare(int num1, int num2) {
		return num1-num2;
	}
}


 

//结果:

支点:3
支点:2
支点:4
支点:3
[1, 2, 2, 3, 3, 3, 4]
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值