堆排序

来源:互联网 发布:js 验证码倒计时 编辑:程序博客网 时间:2024/06/07 05:32

堆排序过程
1. 建立堆
2. 对堆排序
统计大文件中数据单词次数前k的问题中需要应用。
注意 :
1. 堆的建立过程是从底自上;
2. 堆的排序过程是从上自下,其过程很好理解,在建立堆的过程中要从底部向上调整元素,保证底部子节点小于父节点,如果先从父节点开始,则不能保证此性质;排序过程则需要将最大元素(最小元素)排除出去,所以是堆顶开始,从上自下调整的。

// an index in arr[]. n is size of heapvoid heapify(int arr[], int n, int i){    int largest = i;  // Initialize largest as root    int l = 2*i + 1;  // left = 2*i + 1    int r = 2*i + 2;  // right = 2*i + 2    // If left child is larger than root    if (l < n && arr[l] > arr[largest])        largest = l;    // If right child is larger than largest so far    if (r < n && arr[r] > arr[largest])        largest = r;    // If largest is not root    if (largest != i)    {        swap(arr[i], arr[largest]);        // Recursively heapify the affected sub-tree        heapify(arr, n, largest);    }}// main function to do heap sortvoid heapSort(int arr[], int n){    // Build heap (rearrange array)    for (int i = n / 2 - 1; i >= 0; i--)        heapify(arr, n, i);    // One by one extract an element from heap    for (int i=n-1; i>=0; i--)    {        // Move current root to end        swap(arr[0], arr[i]);        // call max heapify on the reduced heap        heapify(arr, i, 0);    }}

http://www.geeksforgeeks.org/heap-sort/

原创粉丝点击