1. 程式人生 > >堆的時間復雜度

堆的時間復雜度

位置 堆排序 for col static tde reat swa stat

構建堆的過程,O(N)

從下面的元素向下沈

package sortdemo;

import java.util.Arrays;

/**
 * Created by chengxiao on 2016/12/17.
 * 堆排序demo
 */
public class HeapSort {
    public static void main(String []args){
        int []arr = {9,8,7,6,5,4,3,2,1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    
public static void sort(int []arr){ //1.構建大頂堆 for(int i=arr.length/2-1;i>=0;i--){ //從第一個非葉子結點從下至上,從右至左調整結構 adjustHeap(arr,i,arr.length); } //2.調整堆結構+交換堆頂元素與末尾元素 for(int j=arr.length-1;j>0;j--){ swap(arr,0,j);//將堆頂元素與末尾元素進行交換 adjustHeap(arr,0
,j);//重新對堆進行調整 } } /** * 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上) * @param arr * @param i * @param length */ public static void adjustHeap(int []arr,int i,int length){ int temp = arr[i];//先取出當前元素i for(int k=i*2+1;k<length;k=k*2+1){//從i結點的左子結點開始,也就是2i+1處開始
if(k+1<length && arr[k]<arr[k+1]){//如果左子結點小於右子結點,k指向右子結點 k++; } if(arr[k] >temp){//如果子節點大於父節點,將子節點值賦給父節點(不用進行交換) arr[i] = arr[k]; i = k; }else{ break; } } arr[i] = temp;//將temp值放到最終的位置 } /** * 交換元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a] = arr[b]; arr[b] = temp; } }

堆排序,每次交換堆頂的元素和結尾的元素,調整堆,每次O(logN)

堆插入,push_heap每次將元素放在結尾,將結尾元素向上查找更大或更小的元素下沈,每次O(logN)

堆刪除,pop_heap,刪除堆頂元素,將堆頂元素放在結尾等待刪除,將剩下的元素重建建堆。

堆的時間復雜度