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

    xiaoxiao2022-07-07  204

    快速排序快速搞定

    一次完整的排序过程: 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)