《演算法導論》CLRS演算法C++實現(三)P75 堆排序

來源:互聯網
上載者:User

第六章 堆排序

主要分為三個子演算法。演算法MAX-HEAPIFY(A, i)為調整堆,演算法BUILD-MAX-HEAP(A)為建堆,演算法HEAPSORT(A)為堆排序。運行環境Code::Blocks 10.05。

MAX-HEAPIFY(A, i)

 1 l ← LEFT(i) 2 r ← RIGHT(i) 3 if l ≤ heap-size[A] and A[l] > A[i] 4     then largest ← l 5 else largest ← i 6 if r ≤ heap-size[A] and A[r] > A[largest] 7     then largest ← r 8 if largest ≠ i 9     then swap(A[i], A[largest])10     MAX-HEAPIFY(A, largest)

BUILD-MAX-HEAP(A) 

heap-size[A] ← length[A]for i ← ⌊length[A]/2⌋ down to 1    do MAX-HEAPIFY(A, i)

 HEAPSORT(A)

1 BUILD-MAX-HEAP(A)2 for i ← length[A] downto 23     do exchange A[1]  A[i]4     heap-size[A] ← heap-size[A] - 15     MAX-HEAPIFY(A, 1)

C++代碼實現

 1 #include <iostream> 2  3 using namespace std; 4  5 //交換x和y 6  7 void swap(int* x, int* y) 8 { 9     int temp;10     temp = *x;11     *x = *y;12     *y = temp;13 }14 15 //返回左孩子的下標16 inline int left(int i)17 {18     return 2 * i + 1;19 }20 21 //返回右孩子的下標22 inline int right(int i)23 {24     return 2 * i + 2;25 }26 27 //返回父結點28 inline int parent(int i)29 {30     if(i % 2)31         return (i - 1) / 2;32     return (i - 2) / 2;33 }34 35 void maxHeapify(int* arr, int i, int heapsize)36 {37     int l = left(i);38     int r = right(i);39     int largest;40     if((l < heapsize) && (arr[l] > arr[i]))41         largest = l;42     else43         largest = i;44     if((r < heapsize) && (arr[r] > arr[largest]))45         largest = r;46     if(largest != i)47     {48         swap(arr[i], arr[largest]);49         maxHeapify(arr, largest, heapsize);50     }51 }52 53 void buildMaxHeap(int* arr, int length)54 {55     int i;56     for(i = length / 2; i >= 0; i--)57     {58         maxHeapify(arr, i, length);59     }60 }61 62 void heapSort(int* arr, int length)63 {64     int i, heapsize = length;65     buildMaxHeap(arr, length);66     for(i = heapsize - 1; i > 0; i--)67     {68         swap(arr[0], arr[i]);69         heapsize--;70         maxHeapify(arr, 0, heapsize);71     }72 }73 74 int main()75 {76     int arr[] = {0, 2, 6, 98, 34, -5, 23, 11, 89, 100, 7};77     heapSort(arr, 11);78     for(int i = 0; i < 11; i++)79     {80         cout << arr[i] << " ";81     }82     cout << endl;83     return 0;84 }

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.