堆排序

来源:互联网 发布:淘宝店铺怎么起名字 编辑:程序博客网 时间:2024/05/17 02:40
/*最大堆定义:每个父节点中的数据项都大于或等于其子节点中的数据项。  堆排序:1)对所有元素建立最大堆  (从最后一个节点的父节点开始向上重构最大堆)2)取出堆顶的最大记录与数组末端的记录交换,重构最大堆。*/#include <iostream>#include <time.h>using namespace std;#define N 16void PrintArr(int *pnArr, int nLen){int i;for (i = 0; i < nLen; i++){cout<<pnArr[i]<<" ";}cout<<endl;}//返回父节点下标int GetParent(int nPos){return (nPos - 1) / 2;}//返回左孩子下标int GetLChild(int nPos){return 2 * nPos + 1;}//返回右孩子下标int GetRChild(int nPos){return 2 * nPos + 2;}//调整nPos位置的元素,重构以nPos为父节点的最大堆void MaxHeapify(int *pnArr, int nLen, int nPos){int nLChildPos = GetLChild(nPos);int nRChildPos = GetRChild(nPos);//1、找出nPos与nPos的左右孩子中数据项最大的元素的下标int nMaxPos = nPos;if (nLChildPos < nLen &&  pnArr[nMaxPos] < pnArr[nLChildPos]){nMaxPos = nLChildPos;}if (nRChildPos < nLen &&  pnArr[nMaxPos] < pnArr[nRChildPos]){nMaxPos = nRChildPos;}if (nMaxPos != nPos){//2、将数据项最大的元素与nPos位置的元素交换swap(pnArr[nMaxPos], pnArr[nPos]);//3、重构以nMaxPos为父节点的最大堆MaxHeapify(pnArr, nLen, nMaxPos);}}//建立最大堆 (从最后一个节点的父节点开始向上重构最大堆)void BuildMaxHeap(int *pnArr, int nLen){int i;for (i = GetParent(nLen - 1); i >= 0; i--){MaxHeapify(pnArr, nLen, i);}}//最大堆排序void HeapSort(int *pnArr, int nLen){//1、建立最大堆BuildMaxHeap(pnArr, nLen);for (int i = nLen - 1; i > 0; i--){//2、堆顶元素与数组最后元素交换swap(pnArr[i], pnArr[0]);nLen--;//3、调整堆顶元素,重构最大堆MaxHeapify(pnArr, nLen, 0);}}int main(){int nArr[N] = {0};int i;srand(time(NULL));for (i = 0; i < N; i++){nArr[i] = rand() % 100;  //rand(nMax - nMin + 1) + nMin ----> [nMin, nMax]}PrintArr(nArr, N);HeapSort(nArr, N);PrintArr(nArr, N);return 0;}

0 0
原创粉丝点击