堆排序是利用堆這種資料結構而設計的一種排序演算法。時間複雜度為 o(n * lg n)。
介紹堆排序前,我們先介紹一下堆的相關概念,如果你對堆的概念還不熟悉的話可以看看。
除最底層外,該樹是完全充滿的,且是從左到右填充。
樹的根結點是 a[ 1 ],若某一結點下標為 i,則很容易得到它的父節點為 i/2,左子結點為 2i,右子結點為 2i + 1。
注意:陣列的索引是 0 開始的,其左右子結點分別為 2i + 1 和 2i + 2。
最大堆即父結點的值大於等於子結點的值;最小堆即父結點的值小於等於子結點的值。
堆是乙個很有用的資料結構,它的乙個常見應用即:優先佇列。
主要是 3 個方法:
heapsort() 方法進行堆排序,裡面會呼叫 buildheap() 方法和 maxheapify() 方法。
buildheap() 方法將乙個陣列構建為乙個最大堆。
maxheapify() 方法調整堆,使得這個堆滿足最大堆的性質。
public class main ;
heapsort(arr);
printarray(arr);
}public static void heapsort(int arr)
}public static void buildheap(int arr)
}public static void maxheapify(int arr, int index, int heapsize)
// 如果右子結點比 max(this, left)還大,則將最大值索引設為右子節點
if (rightindex < heapsize && arr[rightindex] > arr[maxindex])
// 如果當前結點的值不是最大的,則需要交換最大值,並繼續遍歷交換後的子結點
if (maxindex != index)
}public static void printarray(int arr)
system.out.println();}}
**實現基本沒什麼差異。
#include void swap(int *a, int *b)
void maxheapify(int *arr, int index, int heapsize)
// 如果右子結點比 max(this, left)還大,則將最大值索引設為右子節點
if (rightindex < heapsize && arr[rightindex] > arr[maxindex])
// 如果當前結點的值不是最大的,則需要交換最大值,並繼續遍歷交換後的子結點
if (maxindex != index)
}void buildheap(int *arr, int length)
}void heapsort(int *arr, int length)
}void printarray(int *array, int length)
}int main()
; heapsort(arr, sizeof(arr) / sizeof(arr[0]));
printarray(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}
1 2 3 4 7 8 9 10 14 16
堆排序法 題目
題目內容 實作max heap的三種操作 push,pop,top。指令0 x 代表push,將x push進max heap。指令1 代表pop,將最大的數字pop出來,若heap為空則忽略這道指令。指令2 代表top,將最大的數字印出來,若heap為空則忽略這道指令。輸入格式 本題只有一道測資。...
堆排序實現
今天抽空寫了個堆排序的演算法,廢話不多說,直接上源 include include includeusing namespace std define maxsize 6 void print int a,int size maxsize void percolate up int a,int si...
堆排序實現
1 堆排序演算法描述 1 定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 2 當然,這是小根堆,大根堆則換成 號。k i 相當於 二叉樹的非 葉子結點,k 2i 則是左子節點,k 2i 1 是右子節點...