堆排序是利用特殊二叉樹大頂堆和小頂堆進行排序的演算法,通過將陣列轉化成大頂堆(滿足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...
堆排序時間複雜度 堆排序
科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...
堆排序時間複雜度 堆排序演算法
堆排序是指利用堆積樹這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆是乙個優先順序佇列,對於大頂堆而言,堆頂元素的權值最大。將待排序的數組建堆,然後不斷地刪除堆頂元素,就實現了排序。堆排序基本思想 將待排序序列構造成乙個大頂堆,此時,整個序列的最大...