程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 堆排序實現

C++ 堆排序實現

編輯:C++入門知識

print?void HeapAdjust(int a[],int s,int n)//construct heap  

    int j,t; 
    while(2*s+1<n)//是否存在左子樹  
    { 
        j=2*s+1; 
        if((j+1)<n) 
        { 
            if(a[j]<a[j+1])//左子樹小於右子樹,則需要比較右子樹  
                j++;//序號增加1,指向右子樹  
        } 
        if(a[s]<a[j])//比較s與j為序號的數據  
        { 
            t=a[s]; 
            a[s]=a[j]; 
            a[j]=t; 
            s=j;//交換後該節點的子節點的堆結構被破壞,需要向下重新調整成堆  
        } 
        else//比較左右孩子均大則堆未被破壞,不需要再調整  
            break; 
    } 

void HeapSort(int a[],int n)//堆排序  

    int t,i; 
    int j; 
    //建堆過程  
    for(i=n/2-1;i>=0;i--)//將a[0,n-1]建成大根堆,建堆時從第一個非葉子節點開始判斷是否滿足堆結構,然後進行調整  
        HeapAdjust(a,i,n); 
    //將調整好的堆的堆頂元素輸出(與末尾元素交換),從根節點開始重新調整整個堆  
    //重復進行n-1次  
    for(i=n-1;i>0;i--) 
    { 
        t=a[0];//與第i個記錄交換(i後面的記錄已經有序),將堆頂的記錄輸出  
        a[0]=a[i]; 
        a[i]=t; 
        HeapAdjust(a,0,i);//將a[0]至a[i]重新調整為堆,調整堆時由於之前已經滿足堆結構,只有堆頂被破壞,所以從堆頂開始向下調整  
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved