堆排序C++源代码

  1. // HeapSort.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdlib.h>
  5. #include <iostream>
  6. #include <time.h>
  7. using namespace std;
  8. //调整大根堆
  9. void HeapAdjust(int* pnData, int nStart, int nLen)
  10. {
  11.     int nMaxChild = 0;
  12.     int nTemp = 0;
  13.     while ( ( 2 * nStart + 1) < nLen)
  14.     {
  15.         nMaxChild = 2 * nStart + 1;
  16.         if ( (2 * nStart + 2) < nLen)
  17.         {
  18.             //比较左子树和右子树,记录最大值的Index
  19.             if (pnData[2 * nStart + 1] < pnData[2 * nStart + 2])
  20.             {
  21.                 nMaxChild = 2 * nStart + 2;
  22.             }
  23.         }
  24.         //change data
  25.         if (pnData[nStart] < pnData[nMaxChild])
  26.         {
  27.             //交换nStart与nMaxChild的数据
  28.             nTemp = pnData[nStart];
  29.             pnData[nStart] = pnData[nMaxChild];
  30.             pnData[nMaxChild] = nTemp;
  31.             //堆被破坏,需要重新调整
  32.             nStart = nMaxChild;
  33.         }
  34.         else
  35.         {
  36.             //比较左右孩子均大则堆未破坏,不再需要调整
  37.             break;
  38.         }
  39.     }
  40. }
  41. //堆排序
  42. void HeapSort(int* pnData, int nLen)
  43. {
  44.     int i = 0;
  45.     int nTemp = 0;
  46.     //将pnData[0, Len-1]建成大根堆
  47.     for (i = nLen / 2  - 1; i >= 0; i--)
  48.     {
  49.         ::HeapAdjust(pnData, i, nLen);
  50.     }
  51.     for (i = nLen - 1; i > 0; i--)
  52.     {
  53.         nTemp = pnData[0];
  54.         pnData[0] = pnData[i];
  55.         pnData[i] = nTemp;
  56.         //将pnData[0...i]重写建成大根堆
  57.         ::HeapAdjust(pnData, 0, i);
  58.     }
  59. }
  60. int main()
  61. {
  62.     int a[10] = {0};
  63.     int i = 0;
  64.     srand((unsigned)time(NULL));
  65.     cout << "the orign data:" << endl;
  66.     for (i = 0; i < 10; i++)
  67.     {
  68.         a[i] = ::rand(); 
  69.         cout << a[i] << "/t";
  70.     }
  71.     cout << endl;
  72.     HeapSort(a, 10);
  73.     cout << "after sort data" << endl;
  74.     for (i = 0; i < 10; i++)
  75.     {
  76.         cout << a[i] << "/t";
  77.     }
  78.     cout << endl;
  79. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值