数据结构练习——堆排序
只是把以前的写的代码贴出来而已
#ifndef HEAP_H #define HEAP_H void HeapSort(int* a,int arraySize); void BuildHeap(int* a,int arraySize); void ShiftUp(int* a, int index); void ShiftDown(int* a,int startIndex,int endIndex); void Swap(int& x,int& y); void PrintHeap(int* a,int arraySize); #endif
Heap.cpp
#include "Heap.h" #include <iostream> using std::cout; using std::endl; void HeapSort(int* a,int arraySize) { //先建一个大根堆 BuildHeap(a,arraySize); for(int i=arraySize-1;i>0;i--) { //把根结点最大的元素与最后一个叶子结点交换 Swap(a[i],a[0]); //较小的叶子结点元素换到根结点后,与孩子结点比较 //把堆恢复成大根堆,注意此时的i-1,其实已经把最大的元素 //也就是原来的根结点排除在新的大根堆外面了 //通过这样不断选出最大元素,最终完成从小到大的排序 ShiftDown(a,0,i-1); } } //建大根堆 void BuildHeap(int* a,int arraySize) { for(int i=0;i<arraySize;i++) ShiftUp(a,i); } //从最后一个叶子结点开始,如果比父结点大则往上移 //直至移到根结点 void ShiftUp(int* a, int index) { int currNode=index; int parentNode=(currNode-1)/2; while(parentNode>=0) { if(a[currNode] > a[parentNode]) { Swap(a[currNode],a[parentNode]); //往上移 currNode=parentNode; parentNode=(parentNode-1)/2; } else break; } } //从根结点开始,如果比最大的孩子结点小则往下移 //直至移到最后的叶子结点 void ShiftDown(int* a,int startIndex,int endIndex) { int currNode=startIndex; int leftChild=2*currNode+1; int rightChild=2*currNode+2; int exchangeNode; while(leftChild<=endIndex || rightChild<=endIndex) { //选择左右孩子中较大的一个与父结点比较 if(rightChild<=endIndex) exchangeNode=a[leftChild]>a[rightChild] ? leftChild:rightChild; else exchangeNode=leftChild; if(a[currNode]<a[exchangeNode]) { Swap(a[currNode],a[exchangeNode]); //往下移 currNode=exchangeNode; leftChild=currNode*2+1; rightChild=currNode*2+2; } else break; } } void PrintHeap(int* a,int arraySize) { for(int i=0;i<arraySize;i++) cout<<a[i]<<" "; cout<<endl; } void Swap(int& x,int& y) { int temp=x; x=y; y=temp; }
main.cpp
#include <iostream> #include "Heap.h" int main() { int a[10]={5,1,9,8,3,2,4,6,7,10}; for(int i=0;i<10;i++) a[i]=rand(); HeapSort(a,10); PrintHeap(a,10); system("PAUSE"); return 0; }