quickSort_Java快速排序

快速排序

public class QuickSort {
	
	/*
	 * java快排, left, right分别为要被排序数组(或部分数组)最小、最大的下标索引
	 */
	
	public static void quickSort(int[] array, int left, int right) {
		if (right - left < 1) {		// 数组长度为1 或 0 时,退出排序
			return ;
		}
		// pivot是一个中心值,比这个值小的放左边,比这个值大的放右边,会形成一个以该值为中心的边界
		int pivot = array[left];	
		
		int i = left;		//	从数组左边界开始	
		int j = right;		//	从数组右边界开始
		while (i < j) {		
			// 这里要先从右边找小于pivot的数,因为排序是从小到大,后面有一步是要更新pivot的值,要把更小的值赋给pivot
			// 如果先从左到右开始找,若数组的值均大于pivot如[1,2,3,4,5],i会在index=1的位置跳出循环,直到j=1跳出循环,
			// 在更新时pivot会将array[0]与array[1]的值互换从而导致结果错误;
			while(array[j] >= pivot && i < j) {	// 从右到左找小于pivot的数
				j--;
			};
			while(array[i] <= pivot && i < j) {	// 从左到右找大于pivot的数
				i++;
			};

			// 将每次循环得到的第一个小于pivot和大于pivot的数交换位置, i < j的判断可以省略
			if (i < j) {				
				int tmp = array[j];
				array[j] = array[i];
				array[i] = tmp;
			}	
		}	// 循环结束后得到一个左半边(下标<= i,值全部<= pivot)和一个右半边(全部 >= pivot)
		
		// 将pivot与分界线的值互换以 更新pivot
		array[left] = array[i];	// 更新pivot(否则左半边的pivot将不变),这里array[i]的值一定会< pivot,
								// 除非从left到right都>=pivot
		array[i] = pivot;
		
		quickSort(array, left, i - 1);
		quickSort(array, i + 1, right);
		
		// slower
		/*
		// 每次发现比pivot大的值便把这个值放到pivot前面
		for (int i = left+1; i <= right; i++) {	
			if (array[i] < pivot) {
				// 逐步将大于pivot的值与前面小于等于pivot互换,直到放到pivot前面
				for (int j = i; j > left; j--) {
					int tmp = array[j];
					array[j] = array[j-1];
					array[j-1] = tmp;
				}
				left++;
			}
		}
		quickSort(array, 0, left-1);
		quickSort(array, left+1, right);
		*/
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值