阿布学排序之快速排序

package quicksort;
/**
 * 快速排序是一种划分交换排序,采用了分治策略,时间复杂度为O(NlogN),总共需要logN次选取基准数,整个是一个树结构,每一层的复杂度是O(N),所以总共是O(NlogN)
 * 思想:
 * 1、先从数列中取出一个数作为基准数
 * 2、将比这个数大的数全都放到它的左边,比它小的全都放它右边
 * 3、再对左右区间重复第二步,直到各区间只有一个数
 * @author AbuGe
 * 例:
 * 0	1 	2 	3 	4 	5 	6 	7 	8 	9
 * 72	6	57	88	60	42	83	73	48	95
 * 将取值比喻成挖坑	
 *步骤:
 *1、选择基准数,挖个坑,这里用0个元素,确定左右区间i = R, j = L
 *2、从后向前遍历,如果比基准数大则j--,直到比基准数小(前提是i < j),找到后将j对应的值赋给挖的坑,这个j对应的值就出现了新的坑,将i++,继续下个数的比较
 *3、从前向后遍历,如果比基准数小则i++,直到比基准数大(前提是i < j),这个j对应的值就出现了新的坑找到后将i对应的值赋给挖的坑,将j--,继续下个数的比较
 *4、重复2和3步,直到i == j,将基准数填入到a[i]中
 */
public class QuickSortDemo 
{
	public static int adjustArray(int array[], int left, int right)
	{
		//第一步挖坑,确定基准数与基准区间
		int i = left;
		int j = right;
		int base = array[i];
		//循环排序
		while(i < j)
		{
			//第二步从后向前比较
			while(i < j && base <= array[j])
			{
				j--;
			}
				
			//确定是否是由于base <= array[j]引发的上一个while的退出,如果是则将a[j]填入上一次的坑
			if(i < j)
			{
				array[i] = array[j];
				i++;
			}
			
			//第三步从前向后比较
			while(i < j && base >= array[i])
			{
				i++;
			}
			//确定是否是由于base <= array[j]引发的上一个while的退出,如果是则将a[i]填入上一次的坑
			if(i < j)
			{
				array[j] = array[i];
				j--;
			}
		}
		//此时i == j,执行第四步
		array[i] = base;
		return i;
	}
	//运用分治和递归的方法进行快速排序,完成递增排序
	public static void quickSort(int[] array, int left, int right)
	{
		if(left < right)//这个判断至关重要,这是递归判断的出口,这个必须有!!!!!!!!!!!!!
		{
			//先挖坑填数,将数组分成两部分,获得分区下标i
			int i = adjustArray(array, left, right);
			//左区间递归调整
			quickSort(array, left, i - 1);
			//右区间递归调整
			quickSort(array, i + 1, right);
		}
		
	}
	public static void main(String[] args)
	{
		int[] array = {72, 6, 57, 88, 60, 42, 83, 73, 48, 95};
		
		int len = array.length;
		System.out.print("排序前:");
		for(int a : array)
		{
			System.out.print(a + " ");
		}
		quickSort(array, 0, len - 1);
		System.out.println();
		System.out.print("排序后:");
		for(int a : array)
		{
			System.out.print(a + " ");
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值