zoukankan      html  css  js  c++  java
  • 堆排序2

    /*堆排序(小顶堆) 2014.4.2*/ 
    
    #include <iostream>
    using namespace std;
    
    //在堆(已是小顶堆)的末位插入数据i后,通过
    //MinHeapFixup(节点上移)函数调整为小顶堆
    void MinHeapFixup(int a[], int i)  
    {  
        int j, temp;        
        temp=a[i];  
        j=(i-1)/2;            //父结点  
        while(j>=0 &&i!=0)
        {  
            if (a[j]<=temp)  
                break;            
            a[i] = a[j];      //把较大的子结点往下移动,替换它的子结点  
            i = j;  
            j = (i - 1) / 2;  
        }  
        a[i] = temp;  
    }  
    
    
    //在最小堆中加入新的数据nNum  
    void MinHeapAddNumber(int a[], int n, int i)  
    {  
        a[n] = i;            //先插入数据i
        MinHeapFixup(a, n);  //从新调整为小顶堆
    } 
    
    //将小顶堆树根数据和树末位数据交换后,通过MinHeapFixdown
    //(节点下移)函数将n个数据调整为小顶堆(i标示要调整的起点)
    void MinHeapFixdown(int a[], int i, int n)  
    {  
        int j, temp;    
        temp=a[i];  
        j = 2 * i + 1;  
        while (j<n)  
        {  
            if (j +1<n && a[j+1]<a[j]) //在左右孩子中找最小的  
                j++;  
            if (a[j]>=temp)  
                break;  
            a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点  
            i=j;  
            j = 2*i+1;  
        }  
        a[i] = temp;  
    }  
    //在最小堆中删除数  
    void MinHeapDeleteNumber(int a[], int n)  
    {  
        swap(a[0],a[n-1]);             //将树根数据和树末位数据交换
        MinHeapFixdown(a,0, n-1);      //调整前n-1个数据为最小堆
    } 
    
    //建立最小堆  
    void MakeMinHeap(int a[], int n)
    {  
        for (int i=n/2-1;i>=0;i--)
            MinHeapFixdown(a,i,n);
    }  
    
    void MinheapsortTodescendarray(int a[], int n)  
    {  
        for (int i = n - 1; i >= 1; i--)  
        {  
            swap(a[i], a[0]);  
            MinHeapFixdown(a, 0, i);  
        }  
    }  
    
    int main(int argc, char *argv[])
    {
        int a[]={0,16,20,3,11,17,8,15};   //要排序的数为a[1]...a[6],a[0]不参与排序
        MakeMinHeap(a,8);
        MinheapsortTodescendarray(a,8);
        for(int i=7;i>=0;i--)             //逆序输出
            cout<<a[i]<<" ";
        cout<<endl;
        system("pause");
        return 0;
    }

    详细原理介绍见:http://blog.csdn.net/morewindows/article/details/6709644

  • 相关阅读:
    tcp/心跳包
    TCP协议中的三次握手和四次挥手(图解)
    http 中get和post
    xmpp总结
    IOS中http请求使用cookie
    sdwebimage总结
    iOS断言
    Object-C自定义对象NSLog输入信息
    NSTimer你真的会用了吗
    ios中block中的探究
  • 原文地址:https://www.cnblogs.com/nilongqibu/p/3641538.html
Copyright © 2011-2022 走看看