码迷,mamicode.com
首页 > 编程语言 > 详细

排序 | 堆排序

时间:2015-09-27 14:53:48      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

先用一段 C++ 代码来看看推排序的过程:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 bool cmp(const int lhs, const int rhs)
 6 {
 7     return lhs > rhs;
 8 }
 9 
10 int main()
11 {
12     int arr[] = {4, 2, 10, 9, 5, 6, 8, 6, 7, 1, 3};
13     make_heap(arr, arr+10);
14     for(int i = 11; i >= 0; --i) {
15         pop_heap(arr, arr+i);
16         for(int i = 0; i < 11; ++i) cout << arr[i] <<  ;
17         cout << endl;
18     }
19 
20     return 0;
21 }

 

主要就是 make_heap、pop_heap

make_heap:建堆,默认最大堆-》得到递增数组(因为pop_heap是把堆顶取出依次放到后面)

pop_heap:arr[0]和arr[i]交换,并维护arr[0]到arr[i-1]的堆结构。

 

meke_heap 里面可以细分为从下往上建堆,递归的来说就是要维护 i,就得维护 i.left 和 i.right。

而 pop_heap 就是 n 次维护 root 节点。

所以,实际上,只需要写一个 maxHeapify。

 1 void maxHeapify(int arr[], int n, int i)
 2 {
 3     int l = 2*i;
 4     int r = 2*i + 1;
 5     int largest = i;
 6     if(l < n && arr[l] > arr[largest])
 7         largest = l 9     if(r < n && arr[r] > arr[largest])
10         largest = r;
11 
12     if(largest == i) return;
13     swap(arr[i], arr[largest]);
14     maxHeapify(arr, n, largest);
15 }

维护堆的过程简单来说就是不断往下沉。

后面的的 meke_heap 和 pop_heap 也就不难写了。

makeHeap(arr, n) :

  for i = n/2 downto 1 :

    maxHeap(arr, n, i);

popHeap(arr, n) :

  swap(arr[0], arr[--n]);

  maxHeap(arr, n, 0);

然后 sortHeap 也容易写出来了:

sortHeap(arr, n) :

  makeHeap(arr, n);

  for i = n downto 0 :

    popHeap(arr, i);

 

排序 | 堆排序

标签:

原文地址:http://www.cnblogs.com/excavator/p/4842175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!