zoukankan      html  css  js  c++  java
  • 《算法导论》CLRS算法C++实现(三)P75 堆排序

    第六章 堆排序

    主要分为三个子算法。算法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 2
    3     do exchange A[1] ↔ A[i]
    4     heap-size[A] ← heap-size[A] - 1
    5     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     else
    43         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 }
  • 相关阅读:
    windows7管理员权限
    Linux编程 第一个Hello World的C程序
    初步接触XCode和IPhone Simulator
    Android调用WCF
    mysql常用命令
    怎样利用Python制作守护进程
    Android模拟器如何设置DNS访问局域网内网站
    ubuntu下mysql攻略
    IIS7快速启动
    内存出错有时候是free后没有给指针赋NULL
  • 原文地址:https://www.cnblogs.com/juventus/p/2535365.html
Copyright © 2011-2022 走看看