八大排序之堆排序

2021-08-15 22:15:09 字數 848 閱讀 7372

public static void heapsort(int arr) 

for (int i = 0; i < arr.length; i++)

int size = arr.length; //堆中用size表示長度

swap(arr, 0, --size);

while (size > 0)

}

// 用 3 0 1 5 2 畫圖,過程清晰。

//陣列最後插入的乙個數不斷往上走,建立大根堆

public static void heapinsert(int arr, int index)

} //調整大根堆,使其成為大根堆

//index代表頭部,最開始時候表示根頭部,不斷下沉的過程

public static void heapify(int arr, int index, int size)

swap(arr, largest, index);

index = largest;

left = index * 2 + 1;

} }public static void swap(int arr, int i, int j)

時間複雜度o(n*longn),額外空間複雜度o(1)。haapinsert時間複雜度o(n),heapify時間複雜度o(n*longn),整體時間複雜度為o(n*longn)。額外空間複雜度因為是根據座標可以直接求出左孩子、右孩子,因此為o(1)。

重點理解heapinsert和heapify過程,注意size邊界問題,例如迴圈條件left

八大排序之堆排序

public class heapsort heapsort num,num.length for int i 0 i 0 i heapadjust array,i,length 從最後乙個元素開始對序列進行調整,不斷的縮小調整的範圍直到第乙個元素 for i length 1 i 0 i priv...

八大排序之堆排序

堆排序法 直接選擇排序的改進 將排序碼k1,k2,k3,kn表示成一棵完全二叉樹,然後從第n 2個排序碼開媽篩選,使由該結點組成的子二叉樹符合堆的定義,然後從第n 2 1個排序碼重複剛才操作,直到第乙個排序碼止,這時候,該二叉樹符合堆的定義,初始堆已經建立。接著,可以按如下方法進行堆排序 將堆中第乙...

八大排序 堆排序

堆排序 利用大頂堆 小頂堆 堆頂記錄的是最大關鍵字 最小關鍵字 這一特性,使得每次從無序中選擇最大記錄 最小記錄 變得簡單。其基本思想為 大頂堆 1 將初始待排序關鍵字序列 r1,r2 rn 構建成大頂堆,此堆為初始的無須區 2 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1...