QuickSort:快速排序

经验证,快速排序是速度最快的排序方式!比冒泡快的不是一点点!

/**冒泡排序
     * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。  
     * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。  
     * 针对所有的元素重复以上的步骤,除了最后一个。
     * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 
*/

快速排序的基本思想

         通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

升序排列:

package com.hczk.controller;

import java.util.Arrays;

/**
 * Created by Administrator on 2018/12/11 0011.
 */

public class QuickSort {

    public static void main(String args[]) {
        int[] arrays ={1, 12, 2, 13, 3, -14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19};
        System.out.println(Arrays.toString(subQuickSort(arrays, 0, arrays.length - 1)));
    }


    public static int[] subQuickSort(int[] arrays, int start, int end) {
        if (start < end) {
            int middleIndex = subQuickSortCore(arrays, start, end);//将numbers数组进行一分为二
            subQuickSort(arrays, start, middleIndex - 1);//对低字段表进行递归排序
            subQuickSort(arrays, middleIndex + 1, end);//对高字段表进行递归排序
        }
        return arrays;
    }

    public static int subQuickSortCore(int[] arrays, int start, int end) {
        int middleValue = arrays[start];
        while (start < end) {
            while (arrays[end] >= middleValue && start < end) {//
                end--;
            }
            arrays[start] = arrays[end];
            while (arrays[start] <= middleValue && start < end) {//
                start++;
            }
            arrays[end] = arrays[start];
        }
        arrays[start] = middleValue;
        return start;
    }

}

把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

package com.hczk.controller;

import java.util.Arrays;

/**
 * Created by Administrator on 2018/12/11 0011.
 */

public class QuickSort {

    public static void main(String args[]) {

        int[] arrays ={1, 12, 2, 13, 3, -14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19};
        System.out.println(Arrays.toString(subQuickSort(arrays, 0, arrays.length - 1)));
    }


    public static int[] subQuickSort(int[] arrays, int start, int end) {
        if (start < end) {
            int middleIndex = subQuickSortCore(arrays, start, end);//将numbers数组进行一分为二
            subQuickSort(arrays, start, middleIndex - 1);//对低字段表进行递归排序
            subQuickSort(arrays, middleIndex + 1, end);//对高字段表进行递归排序
        }
        return arrays;
    }

    public static int subQuickSortCore(int[] arrays, int start, int end) {
        int middleValue = arrays[start];
        while (start < end) {
            while (arrays[end] <= middleValue && start < end) {//
                end--;
            }
            arrays[start] = arrays[end];
            while (arrays[start] >= middleValue && start < end) {//
                start++;
            }
            arrays[end] = arrays[start];
        }
        arrays[start] = middleValue;
        return start;
    }

}

降序 

时代不断进步!主要提倡上面的方式,下面的只做参考

package com.hczk.controller;

import java.util.Arrays;

/**
 * Created by Administrator on 2018/12/11 0011.
 */

public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {60, 55, 48, 37, 10, 90, -84, 36};
        System.out.println("升序快排后----->" + Arrays.toString(quickSort(arr, 0, arr.length - 1)));
    }

    public static int[] quickSort(int[] arr, int low, int high) {

        int i, j, temp;
        i = low;//低端下标
        j = high;//高端下标
        temp = arr[i];//取第一个元素为标准元素。

        while (i < j) {//递归出口是 low>=high

            while (i < j && temp <= arr[j]) //在数组的后端扫描
                j--;//移动后j再减了一个,即在temp前一个咯
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }

            while (i < j && arr[i] < temp) //在数组的左端扫描
                i++;
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }

        }//while完,即第一盘排序
        arr[i] = temp;//把temp值放到它该在的位置
//		 System.out.println("第    次排序----->"+Arrays.toString(arr));
        if (low < i) {
            quickSort(arr, low, i - 1);//对左端子数组递归
        }

        if (i < high) {
            quickSort(arr, j + 1, high);//对右端子数组递归
        }

        return arr;
    }

}

相比于上面一个,似乎做了一点改变。

package com.hczk.controller;

import java.util.Arrays;

/**
 * Created by Administrator on 2018/12/11 0011.
 */

public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {60, 55, 48, 37, 10, 90, -84, 36};
        System.out.println("降序快排后----->" + Arrays.toString(quickSort(arr, 0, arr.length - 1)));
    }


    public static int[] quickSort(int[] arr, int high, int low) {
        int i, j, temp;
        i = high;//高端下标
        j = low;//低端下标
        temp = arr[i];//取第一个元素为标准元素。

        while (i < j) {//递归出口是 low>=high
            while (i < j && temp > arr[j])//后端比temp小,符合降序,不管它,low下标前移
                j--;//while完后指比temp大的那个
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            while (i < j && temp < arr[i])
                i++;
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }//while完,即第一盘排序
        arr[i] = temp;//把temp值放到它该在的位置。

        if (high < i) {//注意,下标值
            quickSort(arr, high, i - 1);//对左端子数组递归
        }

        if (i < low) { //注意,下标值
            quickSort(arr, i + 1, low);//对右端子数组递归  ;对比上面例子,其实此时i和j是同一下标!!!!!!!!!!!!!
        }


        return arr;
    }


}

降序排列

猜你喜欢

转载自blog.csdn.net/qq_43532342/article/details/84951849
今日推荐