美文网首页
快速排序及其优化(JAVA)

快速排序及其优化(JAVA)

作者: 蜡笔没了小新_e8c0 | 来源:发表于2019-07-26 18:24 被阅读0次

1.Java代码实现

public class QuickSort {

    /**
     * 选择一个哨兵节点,将所有小于哨兵节点的元素放到左边,大于哨兵节点的元素放到右边
     * 最后将哨兵节点和小部分中的最右边那个值交换(j),i就处于大部分的最左边
     * @param array 数组元素
     * @param low
     * @param high
     */
    public static void quickSort(Integer[] array,int low,int high){
        if(low>=high){
            return;
        }
        int index = divide(array,low,high);
        quickSort(array,low,index-1);
        quickSort(array,index+1,high);
    }

    private static int divide(Integer[] array,int low,int high){
        int i = low+1, j = high;
        while(i<=j){
            while(i<=j&&array[i]<=array[low]){
                i++;
            }
            while(i<=j&&array[j]>array[low]){
                j--;
            }
            if(i<=j) {
                int k = array[j];
                array[j] = array[i];
                array[i] = k;
            }
        }
        int t = array[low];
        array[low] = array[j];
        array[j] = t;
        return j;
    }
}

2.优化策略(三数选中+插入+聚集)

由于一般哨兵节点都选取最左边或最右边的元素,容易造成时间复杂度为O(N*N)的情况(原数组有序),通过选取三个数(一般可以是最左元素,中间元素,最右元素)中的中间那个数来作为哨兵节点可以减少发生最坏的情况。
在元素个数比较少的情况下,插入排序要由于快排,所以在划分元素足够少的情况下,可以通过插入排序来进行排序。
同时在第一次遍历时,将重复元素聚集在一起,可以减少迭代次数。

public class QuickSort {

    /**
     * @param array 数组元素
     * @param low
     * @param high
     */
    public static void quickSort(Integer[] array,int low,int high){
        if(low>=high){
            return;
        }
        selectPivotMedianOfThree(array,low,high);
        int index = divide(array,low,high);
        int i = index-1,j = index+1;

        //聚集
        int ii = i,jj = j;
        while(ii>=low){
            if(array[index].equals(array[ii])){
                swap(array[ii],array[i]);
                i--;
            }
            ii--;
        }
        while(jj<=high){
            if(array[index].equals(array[jj])){
                swap(array[jj],array[j]);
                j++;
            }
            jj++;
        }

        if(i-low < 10){
            insertSort(array,low,i);
        }else {
            quickSort(array, low, i);
        }
        if(high-j < 10){
            insertSort(array,j,high);
        }else {
            quickSort(array, j, high);
        }
    }

    private static int divide(Integer[] array,int low,int high){
        int i = low+1, j = high;
        while(i<=j){
            while(i<=j&&array[i]<=array[low]){
                i++;
            }
            while(i<=j&&array[j]>=array[low]){
                j--;
            }
            if(i<=j) {
                swap(array[i],array[j]);
            }
        }
        swap(array[low],array[j]);
        return j;
    }

    //三数选中
    private static void selectPivotMedianOfThree(Integer[] array,int low,int high){
        int m = (low+high)/2;
        //实现 array[mid] <= array[low] <= array[high]
        if(array[high] < array[low]){
            swap(array[high],array[low]);
        }
        if(array[high] < array[m]){
            swap(array[high],array[m]);
        }
        if(array[m] > array[low]){
            swap(array[m],array[low]);
        }
    }

    //插入排序
    private static void insertSort(Integer[] array,int low,int high){
        for(int i = low+1; i < high; i++){
            Integer da = array[i];
            int j = i - 1;
            for(; j >= low; j--){
                if(array[j] <= da){
                    break;
                }
                array[j+1] = array[j];
            }
            array[j+1] = da;
        }
    }

    private static void swap(Integer a, Integer b){

        int tem= a;
        Field field= null;
        try {
            field = Integer.class.getDeclaredField("value");
            field.setAccessible(true);
            field.setInt(a, b);
            field.setInt(b, tem);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • 快速排序及其优化(JAVA)

    1.Java代码实现 2.优化策略(三数选中+插入+聚集) 由于一般哨兵节点都选取最左边或最右边的元素,容易造成时...

  • 排序--快速排序及其优化

    版权声明:本文源自简书tianma,转载请务必注明出处:http://www.jianshu.com/p/df8a...

  • 快速排序及其优化

    算法简介 是一种分治的排序算法,特点就是快,而且效率高。 基本思路 通过一趟排序将待排元素分隔成独立的两部分,其中...

  • 快速排序 及其 优化

    快速排序是基于分治思想的排序算法,核心是划分与递归,不需要额外的辅助空间。 快排的基本实现 1.保持随机性 切分元...

  • 快速排序及其优化

    快速排序是不稳定的排序方法,原因在于pivot元素移位的时候可能会造成相等元素之间位置发生变化。 快排的时间复杂度...

  • 对于基础排序算法的简要总结

    本文主要分析排序算法中的选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序,以及其部分优化方式,部分代码示例...

  • Arrays.sort使用的排序算法

    直接开门见山 java中Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。 快速排序主要是对哪些...

  • 算法-排序-快速排序优化

    算法-排序-快速排序优化

  • 《大话数据结构》笔记二(排序)

    1 冒泡排序(优化)2 选择排序3 直接插入排序4 希尔排序5 堆排序6 归并排序(优化)7 快速排序(优化) 1...

  • 排序算法-2(javascript) 快速排序的实现

    快速排序 快速排序是冒泡排序的优化,与冒泡排序不同的是,使用了分治法,进行优化。会随机选取一个值pivot(基准元...

网友评论

      本文标题:快速排序及其优化(JAVA)

      本文链接:https://www.haomeiwen.com/subject/zbsdrctx.html