高级排序算法

参考博客:https://www.cnblogs.com/guoyaohua/p/8600214.html

1.归并排序

  和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

最佳情况:T(n) = O(n)  最差情况:T(n) = O(nlogn)  平均情况:T(n) = O(nlogn)

https://images2017.cnblogs.com/blog/849589/201710/849589-20171015230557043-37375010.gif

2.快速排序

 

最佳情况:T(n) = O(nlogn)   最差情况:T(n) = O(n2)   平均情况:T(n) = O(nlogn) 

 

代码实现

 

import java.util.Arrays;

public class guibing {
    
    // 归并排序
    // 1.递归拆分
    public static int[] MergeSort(int[] array) {
        if(array.length<2)
            return array;
        int mid = array.length/2;
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        return merge(MergeSort(left),MergeSort(right));
    }
    
    // 2.比较合并
    private static int[] merge(int[] left,int[] right) {
        int[] result = new int[left.length + right.length];
        for(int index=0,i=0,j=0;index<result.length;index++) {
            if(i>=left.length)
                result[index] = right[j++];
            else if(j>=right.length)
                result[index] = left[i++];
            else if(left[i]>right[j])
                result[index] = right[j++];
            else // left[i] <= right[j]
                result[index] = left[i++];
        }
        return result;
    }
    
    // 快速排序
    // 参考博客:https://www.e-learn.cn/content/java/1545532
    public static void QuickSort(int[] array,int low,int high) {
        int i,j,temp,t;
        if(low>high)
            return;
        i = low;
        j = high;
        
        // temp基准位
        temp = array[low];
        
        // 交换位置
        while(i<j) {
            while(temp<=array[j] && i<j)
                j--;
            while(temp>=array[i] && i<j)
                i++;
            if(i<j) {
                t = array[j];
                array[j] = array[i];
                array[i] = t;
            }
        }
        
        // 基准与i和j相等位置的数字交换
        array[low] = array[i];
        array[i] = temp;
        
        // 递归调用
        QuickSort(array, low, j-1);
        QuickSort(array, j+1, high);
    }
    
    // 堆排序
    
    public static void main(String[] args) {
        int[] array = {21,23,5,67,8,11};
        for(int i=0;i<array.length;i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
//        array = MergeSort(array);
        QuickSort(array,0,array.length-1);
        for(int i=0;i<array.length;i++) {
            System.out.print(array[i]+" ");
        }
    }
}

 

 

 

 

 

 


import java.util.Arrays;
public class guibing {// 归并排序// 1.递归拆分public static int[] MergeSort(int[] array) {if(array.length<2)return array;int mid = array.length/2;int[] left = Arrays.copyOfRange(array, 0, mid);int[] right = Arrays.copyOfRange(array, mid, array.length);return merge(MergeSort(left),MergeSort(right));}// 2.比较合并private static int[] merge(int[] left,int[] right) {int[] result = new int[left.length + right.length];for(int index=0,i=0,j=0;index<result.length;index++) {if(i>=left.length)result[index] = right[j++];else if(j>=right.length)result[index] = left[i++];else if(left[i]>right[j])result[index] = right[j++];else // left[i] <= right[j]result[index] = left[i++];}return result;}// 快速排序// 参考博客:https://www.e-learn.cn/content/java/1545532public static void QuickSort(int[] array,int low,int high) {int i,j,temp,t;if(low>high)return;i = low;j = high;// temp基准位temp = array[low];// 交换位置while(i<j) {while(temp<=array[j] && i<j)j--;while(temp>=array[i] && i<j)i++;if(i<j) {t = array[j];array[j] = array[i];array[i] = t;}}// 基准与i和j相等位置的数字交换array[low] = array[i];array[i] = temp;// 递归调用QuickSort(array, low, j-1);QuickSort(array, j+1, high);}// 堆排序public static void main(String[] args) {int[] array = {21,23,5,67,8,11};for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");}System.out.println();//array = MergeSort(array);QuickSort(array,0,array.length-1);for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");}}}

 

posted @ 2020-02-28 16:22  liaomj  阅读(226)  评论(0)    收藏  举报