八种排序方法(六)——堆排序

来源:互联网 发布:mac编辑图片怎么保存 编辑:程序博客网 时间:2024/05/17 23:06

编译器:Xcode
编程语言:C++

源程序:

#include <iostream>using namespace std;void swap(int a[],int i,int j) //交换函数{    int temp;    temp=a[i];    a[i]=a[j];    a[j]=temp;}void heapAdjust(int a[],int i,int n){    int temp;    //假设第一个结点的元素是最大的    temp=a[i];    //i结点:2*i是i结点的左结点,2*i+1是结点的右结点    //把结点元素大的交换到前面    for(int j=2*i;j<=n;j*=2)    {        if(j<n && a[j]<a[j+1])            j++;        if(temp>=a[j])            break;        a[i]=a[j];        i=j;    }    a[i]=temp;}//堆排序将数组先组成二叉树,默认从数组的a[1]开始排,a[0]是无效数据void heapSort(int a[],int n) //堆排序{    int i;    //先将数组组成一棵完全二叉树    //从2/n开始,就是从倒数第二排结点往前开始    for(int i=n/2;i>0;i--)    {        heapAdjust(a, i, n);    }    //循环每个结点,将大的结点交换到堆顶    for(i=n;i>1;i--)    {        swap(a,1,i);        //每次交换完都要调整二叉树,将剩下的最大结点交换到堆顶        heapAdjust(a, 1, i-1);    }}int main(){    int a[11] = {-1,43, 65, 4, 23, 6, 98, 2, 65, 7, 79};    cout<<"堆排序:"<<endl;    heapSort(a, 10);    for(int i=1;i<11;i++)        cout<<a[i]<<" ";    cout<<endl;    return 0;}

运行结果:

堆排序:2 4 6 7 23 43 65 65 79 98 Program ended with exit code: 0