007-排序算法-堆排序

1、概述java

  堆排序(英語:Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆是一個近似徹底二叉樹的結構,並同時知足堆積的性質:即子結點的鍵值或索引老是小於(或者大於)它的父節點。git

排序方法 時間複雜度(平均) 時間複雜度 (最壞) 時間複雜度(最好) 空間複雜度 穩定性
堆排序 $O(nlogn)$ O(nlogn) O(nlogn) O(1) 不穩定

  在堆的數據結構中,堆中的最大值老是位於根節點(在優先隊列中使用堆的話堆中的最小值位於根節點)。堆中定義如下幾種操做:github

  • 最大堆調整(Max Heapify):將堆的末端子節點做調整,使得子節點永遠小於父節點
  • 建立最大堆(Build Max Heap):將堆中的全部數據從新排序
  • 堆排序(HeapSort):移除位在第一個數據的根節點,並作最大堆調整的遞歸運算

1.一、說明算法

   

  不斷將大根堆的堆頂元素與堆尾元素交換,再重建大根堆的過程。將待排序列構建成大根堆,用變量 heapSize 來控制堆的大小,而後不斷地 heapify ,直到 heapSize 等於零。在 heapify 的過程當中就是先比較子節點的大小,而後比較父節點和子節點的大小,若是最後發現父節點是比子節點大的話跳出 heapify 循環,不然將子節點與父節點交換,而且找到子節點的左孩子,再重複上訴過程,直到左孩子的位置 left 大於 heapSize ,heapify 循環結束.api

1.二、代碼實現數據結構

public class HeapSort {
    public static void heapSort(int [] arr){
        if(arr == null || arr.length < 2){
            return;
        }
        for(int i = 0; i< arr.length; i++){
            heapInsert(arr,i);
        }

        int heapSize = arr.length;
        swap(arr, 0, --heapSize);
        while(heapSize > 0){
            heapify(arr, 0, heapSize);
            swap(arr, 0, --heapSize);
        }
    }

    private static void heapInsert(int[] arr, int index){
        while(arr[index] > arr[(index - 1) / 2]){
            swap(arr, index, (index -1)/2);
            index = (index -1) / 2;
        }
    }

    private static void heapify(int[] arr, int index, int heapSize){
        int left = index * 2 + 1;
        while(left < heapSize){
            int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;
            largest = arr[largest] > arr[index] ? largest : index;
            if(largest == index){
                break;
            }
            swap(arr, largest, index);
            index = largest;
            left = index * 2 +1;
        }
    }

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

代碼地址:地址 中的algorithm-001-sort中 HeapSort  ui

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發送到spa

相關文章
相關標籤/搜索