最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java綜合整理堆排序?快速排序?歸并排序

 更新時(shí)間:2022年01月19日 16:49:55   作者:小寫(xiě)丶H  
堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為O(nlogn),它也是不穩(wěn)定排序。首先簡(jiǎn)單了解下堆結(jié)構(gòu)

堆排序

  • 時(shí)間復(fù)雜度:0(N*log(N))
  • 空間復(fù)雜度:0(1)
  • 穩(wěn)定性:不穩(wěn)定
private static void heapSort(int[] arr) {
		//建堆
        crearHeap(arr);
        for (int i = 0; i < arr.length-1; i++) {
            int heapSize=arr.length-i;
            swap(arr,heapSize-1,0);
            heapSize--;
            shiftDown(arr,heapSize,0);
        }
        System.out.println(Arrays.toString(arr));
    }

    private static void crearHeap(int[] arr) {
    	// 從后往前遍歷(右邊非葉子節(jié)點(diǎn)開(kāi)始), 依次進(jìn)行向下調(diào)整
        for (int i = (arr.length-1-1)/2; i >=0 ; i--) {
            shiftDown(arr,arr.length,i);
        }
        
    }
	//向下調(diào)整,形成大堆
    private static void shiftDown(int[] arr, int size, int i) {
        int parent = i;
        int child = parent*2+1;
        while (child<size){
            if (child +1< size && arr[child +1]> arr[child]){
                child=child+1;
            }
            if (arr[child]>arr[parent]){
                swap(arr,child,parent);
            }else {
                break;
            }
            parent=child;
            child=parent*2+1;
        }
    }
	//交換
    private static void swap(int[] arr, int child, int parent) {
        int tmp =arr[child];
        arr[child] =arr[parent];
        arr[parent]=tmp;
    }

快速排序

  • 時(shí)間復(fù)雜度:O(N^ logN) 最壞的時(shí)候O(N^2) 和基準(zhǔn)值密切相關(guān)
  • 空間復(fù)雜度:0(logN) 最壞的時(shí)候O(N)
  • 穩(wěn)定性:不穩(wěn)定

遞歸

private static void quick(int[] arr) {
        quickSortHelper(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    private static void quickSortHelper(int[] arr, int left, int right) {
        if (left>=right){
            //區(qū)間只有一個(gè)元素,或者零個(gè)元素
            return;
        }
        int index = partition(arr,left,right);
        quickSortHelper(arr,left,index-1);
        quickSortHelper(arr,index+1,right);
    }

    private static int partition(int[] arr, int left, int right) {
        int i=left;
        int j=right;
        int baseValue=arr[right];
        while (i<j){
            while (i<j && arr[i]<=baseValue){
                i++;
            }
            while (i<j && arr[j]>=baseValue){
                j--;
            }
            if (i<j){
                swap(arr,i,j);
            }
        }
        swap(arr,i,right);
        return i;
    }

    private static void swap(int[] arr, int i, int j) {
        int tmp =arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
    }

非遞歸

public static void quickSortByLoop(int[] arr) {
        Stack<Integer> stack =new Stack<>();
        stack.push(0);
        stack.push(arr.length-1);
        while (!stack.isEmpty()){
            int right = stack.pop();
            int left = stack.pop();
            if (left>=right){
                continue;
            }
            int index = partition(arr,left,right);
            //右子樹(shù)
            stack.push(index+1);
            stack.push(right);
            //左子樹(shù)
            stack.push(left);
            stack.push(index-1);
        }
        System.out.println(Arrays.toString(arr));
    }

    private static int partition(int[] arr, int left, int right) {
        int baseValue =arr[right];
        int i =left;
        int j =right;
        while (i<j){
            while (i<j && arr[i]<=baseValue){
                i++;
            }
            while (i<j && arr[j]>=baseValue){
                j--;
            }
            if (i<j){
                swap(arr,i,j);
            }
        }
        swap(arr,i,right);
        return i;
    }

    private static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

歸并排序

  • 時(shí)間復(fù)雜度:O(NlogN)
  • 空間復(fù)雜度:O(N) 如果是鏈表,可以為O(1)
  • 穩(wěn)定性:穩(wěn)定

遞歸

public static void mergeSort(int[] arr){
        mergeSortHelper(arr,0,arr.length);
        System.out.println(Arrays.toString(arr));
    }

    private static void mergeSortHelper(int[] arr, int left, int right) {
        if (right-left<=1){
            return;
        }
        int mid = (right+left)/2;

        mergeSortHelper(arr,left,mid);
        mergeSortHelper(arr,mid,right);
        merge(arr,left,mid,right);
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        int cur1 =left;
        int cur2 =mid;
        //兩個(gè)數(shù)組合并后的結(jié)果
        int[] output=new int[right-left];
        int outputIndex=0;

        while (cur1<mid && cur2<right){
            if (arr[cur1]<=arr[cur2]) {
                output[outputIndex++] = arr[cur1++];
            }else {
                output[outputIndex++] = arr[cur2++];
            }
        }
        while (cur1<mid){
            output[outputIndex++] = arr[cur1++];
        }
        while (cur2<right){
            output[outputIndex++] = arr[cur2++];
        }

        for (int i = 0; i < right-left ; i++) {
            arr[left+i] = output[i];
        }
    }

非遞歸

public static void mergeSortByLoop(int[] arr){
        // gap 當(dāng)前每個(gè)組中的元素個(gè)數(shù).
        for (int gap =1;gap<arr.length;gap*=2){
            for (int i = 0; i <arr.length ; i+=2*gap) {
                //相當(dāng)于把兩個(gè)長(zhǎng)度為 gap 的相鄰組進(jìn)行了合并
                int left =i;
                int mid =i+gap;
                int right=i+2*gap;
                if (mid > arr.length){
                    mid =arr.length;
                }
                if (right>arr.length){
                    right=arr.length;
                }
                merge(arr,left,mid,right);
            }
        }
        System.out.println(Arrays.toString(arr));
    }

到此這篇關(guān)于Java綜合整理堆排序 快速排序 歸并排序的文章就介紹到這了,更多相關(guān)Java 排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java編程中super關(guān)鍵字的用法

    詳解Java編程中super關(guān)鍵字的用法

    這篇文章主要介紹了Java編程中this與super關(guān)鍵字的用法,包括從內(nèi)存結(jié)構(gòu)方面分析super的作用域,需要的朋友可以參考下
    2015-10-10
  • mybatis-plus支持null字段全量更新的兩種方法

    mybatis-plus支持null字段全量更新的兩種方法

    本文主要介紹了mybatis-plus支持null字段全量更新的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 巧妙mybatis避免Where 空條件的尷尬

    巧妙mybatis避免Where 空條件的尷尬

    這篇文章主要介紹了巧妙mybatis避免Where 空條件的尷尬,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Java如何求交集、并集、差集

    Java如何求交集、并集、差集

    這篇文章主要介紹了Java如何求交集、并集、差集問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot 整合Jest實(shí)例代碼講解

    SpringBoot 整合Jest實(shí)例代碼講解

    本文通過(guò)實(shí)例代碼給大家介紹了SpringBoot 整合Jest的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • gRPC中interceptor攔截器的使用教程

    gRPC中interceptor攔截器的使用教程

    gRPC中的interceptor攔截器分為客戶(hù)端攔截器和服務(wù)端攔截器,分別是在客戶(hù)端和服務(wù)端的請(qǐng)求被發(fā)送出去之前進(jìn)行處理的邏輯,下面就跟隨小編一起學(xué)習(xí)一下interceptor攔截器的具體使用吧
    2023-08-08
  • java編寫(xiě)一個(gè)花名隨機(jī)抽取器的實(shí)現(xiàn)示例

    java編寫(xiě)一個(gè)花名隨機(jī)抽取器的實(shí)現(xiàn)示例

    這篇文章主要介紹了java編寫(xiě)一個(gè)花名隨機(jī)抽取器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 重新理解Java泛型

    重新理解Java泛型

    這篇文章主要介紹了重新理解Java泛型,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 淺談在Java中JSON的多種使用方式

    淺談在Java中JSON的多種使用方式

    這篇文章主要介紹了淺談在Java中JSON的多種使用方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 快速上手Java單元測(cè)試框架JUnit5

    快速上手Java單元測(cè)試框架JUnit5

    今天給大家?guī)?lái)的是關(guān)于Java單元測(cè)試的相關(guān)知識(shí),文章圍繞著Java單元測(cè)試框架JUnit5展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

连城县| 白山市| 从江县| 正阳县| 汤原县| 同德县| 金寨县| 红安县| 青铜峡市| 青河县| 图们市| 德兴市| 宁陵县| 佛山市| 德保县| 十堰市| 芦溪县| 泰顺县| 东明县| 洪雅县| 淮滨县| 建昌县| 台东市| 江口县| 开封县| 杨浦区| 富蕴县| 汶上县| 西乌珠穆沁旗| 石城县| 靖远县| 嘉鱼县| 三河市| 毕节市| 南和县| 塔城市| 长兴县| 沾益县| 菏泽市| 德钦县| 柏乡县|