算法--快速排序的思路、实例,一次完整的详细排序过程

快速排序快速搞定

一次完整的排序过程:
1.在要排序的的数中随机的选出一个数值为基准数,与最后面的一个数值进行交换
2.设置交换区间,初始交换区间的长度为0
3.从左向右遍历,将遍历的当前值与选出的基准数比较,如果当前值小于等于基准数,则将当前值与基准数进行交换,如果大于基准数则继续向后遍历
4.当所有的元素都大于基准数的时候,将基准数与区间后面的第一个元素进行交换,至此完成遍历

最差的情况是:每次划分得到一个空数组(每次确定的基准都是最大或者最小的),进而在递归调用中,尽管一个数组递归调用没有事情做,另一个递归调用必须对n-1个元素而不是n/2个元素进行排序。结果就是 进行n层递归调用而不是logn层。因此坏的调用是O(n^2) ,最好的时候是(nlogn),归并排序总是O(nlogn)

package jianzhioffer;

/* 
 *  快速排序的操作
 *  对数组实现快速排序有三种方式
 *  1.选择第一个数作为基数
 *  2.随机选择一个数作为基数(同样的,把那个随机数与第一个数据进行交换就行)
 *  3.选择中间数作为基数(最好是这种方式,将start mid end 三个值选出来之后进行排序,保证这三个位置有序,选择中间的值作为基数,放到start+1的位置上,这样可以从start+2的位置向右移动,从last-1的位置开始向左移动)
 */
public class quickSort {
	public static void main(String[] args) {
		int[] array = new int[] {10,6,3,8,33,27,66,9,7,88};
		System.out.println(array.length);
		quickSort(array, 0, array.length-1);
		for (int i : array) {
			System.out.print(i+" ,");
		}
	}
	public  static void quickSort(int[] array,int start,int end) {
		if(start<end) {
			int division=adjust(array, start, end);
			quickSort(array, start, division-1);
			quickSort(array, division+1, end);
		}
	}	
	/*
	* 选择第一个数作为基准
	*/
	public static int adjust(int[] array,int start,int end) {
		
		int temp=array[start];
		int left=start;
		int right=end;
		
		while(left<right) {
			
			while(left<right&&temp<array[right]) {// 从右边开始小于基准的数来填,大于基准就找下一个
				right--;
			}
			if(left<right) {
				array[left]=array[right];// 将右边小于基准的值填充到坑中 
				left++;// 左边+1
			}
			while(left<right&&temp>array[left]) {// 从左边开始大于基准的值来填,小于基准的值就找下一个
				left++;
			}
			if(left<right) {
				array[right]=array[left];
				right--;
			}
		}
		array[left]=temp;// 循环退出时候,left和right相同,基准填到这个坑中
		return left;// 返回分割的位置
		//分割位置作为前一个数组的最后位置和后一个数组的第一个位置
	}	
}

在这里插入图片描述
https://www.cnblogs.com/l199616j/p/10597245.html
https://blog.csdn.net/morewindows/article/details/6684558

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值