- // HeapSort.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <stdlib.h>
- #include <iostream>
- #include <time.h>
- using namespace std;
- //调整大根堆
- void HeapAdjust(int* pnData, int nStart, int nLen)
- {
- int nMaxChild = 0;
- int nTemp = 0;
- while ( ( 2 * nStart + 1) < nLen)
- {
- nMaxChild = 2 * nStart + 1;
- if ( (2 * nStart + 2) < nLen)
- {
- //比较左子树和右子树,记录最大值的Index
- if (pnData[2 * nStart + 1] < pnData[2 * nStart + 2])
- {
- nMaxChild = 2 * nStart + 2;
- }
- }
- //change data
- if (pnData[nStart] < pnData[nMaxChild])
- {
- //交换nStart与nMaxChild的数据
- nTemp = pnData[nStart];
- pnData[nStart] = pnData[nMaxChild];
- pnData[nMaxChild] = nTemp;
- //堆被破坏,需要重新调整
- nStart = nMaxChild;
- }
- else
- {
- //比较左右孩子均大则堆未破坏,不再需要调整
- break;
- }
- }
- }
- //堆排序
- void HeapSort(int* pnData, int nLen)
- {
- int i = 0;
- int nTemp = 0;
- //将pnData[0, Len-1]建成大根堆
- for (i = nLen / 2 - 1; i >= 0; i--)
- {
- ::HeapAdjust(pnData, i, nLen);
- }
- for (i = nLen - 1; i > 0; i--)
- {
- nTemp = pnData[0];
- pnData[0] = pnData[i];
- pnData[i] = nTemp;
- //将pnData[0...i]重写建成大根堆
- ::HeapAdjust(pnData, 0, i);
- }
- }
- int main()
- {
- int a[10] = {0};
- int i = 0;
- srand((unsigned)time(NULL));
- cout << "the orign data:" << endl;
- for (i = 0; i < 10; i++)
- {
- a[i] = ::rand();
- cout << a[i] << "/t";
- }
- cout << endl;
- HeapSort(a, 10);
- cout << "after sort data" << endl;
- for (i = 0; i < 10; i++)
- {
- cout << a[i] << "/t";
- }
- cout << endl;
- }
堆排序C++源代码
最新推荐文章于 2023-09-16 11:19:48 发布