堆排序
问题:对可以分为大顶堆和小顶堆。
大顶堆满足父节点大于左右孩子节点:父节点i,则i>2*i ;i>2*i+1;
小顶堆满足父节点小于左右孩子节点:父节点i,则i<2*i ;i<2*i+1;
指针问题,在交换两个变量时,确保交换,要用指针。
下面代码是小顶堆排序。
代码:
#include <iostream> using namespace std; void buildHeap(int arr[],int length) //建立堆 { int i; int *min; int *temp; int t; int f; int k; int flag; int n=length/2; for(i=n;i>0;i--) { f=i; while(2*f<=length) //循环向下判断 { temp=&arr[f-1]; min=&arr[2*f-1]; flag=2*f; if(2*f+1<=length) { if(arr[2*f]<*min) //选择孩子节点中较小的节点 { min=&arr[2*f]; flag=2*f+1; } } if(*min<*temp) //父节点小于孩子节点,则交换 { // cout<<*temp<<":"<<*min<<"--"; t=*temp; *temp=*min; *min=t; f=flag; // cout<<flag<<"--"; } else break; } } } void heapSort(int arr[],int length) // 堆排序 { buildHeap(arr,length); cout<<arr[0]<<" "; arr[0]=arr[length-1]; } int main() { int arr[10]={9,3,5,1,2,0,4,8,6,7}; int i,j; cout<<"排序前:"<<endl; for(i=0;i<10;i++) { cout<<arr[i]<<" "; } cout<<endl; cout<<"堆排序后:"<<endl; for(j=10;j>0;j--) { heapSort(arr,j); } cout<<endl; return 0; }
运行结果: