阿布学排序之快速排序

来源:互联网 发布:温州大学网络报修 编辑:程序博客网 时间:2024/04/28 02:50
package quicksort;/** * 快速排序是一种划分交换排序,采用了分治策略,时间复杂度为O(NlogN),总共需要logN次选取基准数,整个是一个树结构,每一层的复杂度是O(N),所以总共是O(NlogN) * 思想: * 1、先从数列中取出一个数作为基准数 * 2、将比这个数大的数全都放到它的左边,比它小的全都放它右边 * 3、再对左右区间重复第二步,直到各区间只有一个数 * @author AbuGe * 例: * 01 2 3 4 5 6 7 8 9 * 7265788604283734895 * 将取值比喻成挖坑 *步骤: *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)//这个判断至关重要,这是递归判断的出口,这个必须有!!!!!!!!!!!!!{//先挖坑填数,将数组分成两部分,获得分区下标iint 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