複雜度nlog n 之堆排序

2021-07-15 10:51:03 字數 1432 閱讀 5104

堆排序是利用特殊二叉樹大頂堆和小頂堆進行排序的演算法,通過將陣列轉化成大頂堆(滿足array[n]>array[2n+1]和array[n]>array[2n+2]這兩個條件),然後將array[0]和array[array.length-1]交換,然後將無序區重新構建大頂堆。重複之前的步驟知道所有的都變成有序區。

步驟:

1.將陣列變成大頂堆。

2.將array[0]和array[array.length-1]交換。

3.將無序區域重新構建大頂堆。

4.迴圈直至所有區域都有序。

平均時間複雜度

最好時間複雜度

最壞時間複雜度

空間複雜度

nlog(n)

nlog(n)

nlog(n)

o(1)

public static void maxheap(int array, int length, int index) 

if (right

< length && array[right] > array[largest])

if (largest != index)

}

上面就是利用遞迴建立最大堆得過程,大致的步驟是這樣的:

1.先找到當前節點的左子樹。

2.找到當前節點的右子樹。

3.在左右子樹不超出範圍的情況下,比較三者的大小,將最大的節點記錄下。

4.假如當前最大的節點不是父節點,那麼交換他們的位置,滿足父節點最大。因為移動了下面子樹,所以移動的子樹要重新建堆。

public static void buildmaxheap(int array) 

}public static void maxheap(int array, int length, int index)

if (right < length && array[right] > array[largest])

if (largest != index)

}public static void heapsort(int array, int length)

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

}public static int getparentindex(int index)

public static int getleftindex(int index)

public static int getrightindex(int index)

public static void main(string args) ;

heapsort(array, array.length);

}

利用遞迴不停地分割,一直到start和end相同時,就是陣列被分成乙個乙個數的時候,這樣這個資料就變成有序的了。

複雜度nlog n 之快速排序

快速排序是利用分治和遞迴的思想進行的排序演算法,每一次都將第乙個元素置於它在陣列中應該的位置 前面的數字比它小,後面的數字比它大 然後就把此數的前半段和後半段重複前面的操作。核心思想就是利用了乙個paration這個函式。平均時間複雜度 最好時間複雜度 最壞時間複雜度 空間複雜度 nlog n nl...

堆排序時間複雜度 堆排序

科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...

堆排序時間複雜度 堆排序演算法

堆排序是指利用堆積樹這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆是乙個優先順序佇列,對於大頂堆而言,堆頂元素的權值最大。將待排序的數組建堆,然後不斷地刪除堆頂元素,就實現了排序。堆排序基本思想 將待排序序列構造成乙個大頂堆,此時,整個序列的最大...