国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言 數(shù)據(jù)結(jié)構(gòu)堆排序順序存儲(升序)

2020-01-26 14:07:57
字體:
供稿:網(wǎng)友

堆排序順序存儲(升序)

一: 完全二叉樹的概念:前h-1層為滿二叉樹,最后一層連續(xù)缺失右結(jié)點!

二:首先堆是一棵全完二叉樹:

a:構(gòu)建一個堆分為兩步:⑴創(chuàng)建一棵完全二叉樹      ⑵調(diào)整為一個堆

(標注:大根堆為升序,小根堆為降序)

   b:算法描述:①創(chuàng)建一棵完全二叉樹  

②while(有雙親){
A:調(diào)整為大根堆;
B:交換根和葉子結(jié)點;
C:砍掉葉子結(jié)點;
}

  c:時間復(fù)雜度為 O(nlogn)  ,空間復(fù)雜度為 O(1), 是不穩(wěn)定排序!

代碼實現(xiàn):

/*堆排序思想:[完全二叉樹的定義:前 h-1 層為滿二叉樹一最后一層連續(xù)缺失右結(jié)點(即右子女)],(大根堆升序排序,小根堆降序排列)   首先堆是一個完全二叉樹 ,根據(jù)數(shù)組下標就可建成了一棵完全二叉樹   其次:while(有雙親){     A: 調(diào)整為一個大根堆         【Adjust()函數(shù)實現(xiàn)】     B: 交換最后一個葉子結(jié)點和根結(jié)點    【Swap()函數(shù)實現(xiàn)】     C: 砍掉最后一個葉子結(jié)點      【即元素個數(shù) n--】   } */  #include <iostream> #define N 100  using namespace std;   int b[N]={0};    //存儲數(shù)據(jù)的數(shù)組  int n=0;      //記錄數(shù)據(jù)的總個數(shù)【0單元不要,實際元素個數(shù)為(n-1)個】  void Swap(int *x,int *y){   int t;   t=*x;   *x=*y;   *y=t; }   void Adjust(){   int p;         //記錄雙親結(jié)點    int tag=1;       //記錄是否已經(jīng)調(diào)整為大根堆(標志性的變量)   while(tag){       //判斷是否已經(jīng)調(diào)整好為大根堆     p=(n-1)/2;     //最后一個雙親結(jié)點的下標     tag=0;       //凡是交換后,tag=1,標志著還沒有調(diào)整為大根堆,否則繼續(xù)調(diào)整      while(p>0){     //確保有雙親結(jié)點       if(b[p]<b[2*p]){     //若根結(jié)點大于左子女結(jié)點,就交換          Swap(&b[p],&b[2*p]);         tag=1;       }       if(2*p+1<n && b[p]<b[2*p+1]){ //若存在右子女,并且根結(jié)點大于右子女結(jié)點,就交換          Swap(&b[p],&b[2*p+1]);         tag=1;            }       p--;        //直到最后一個雙親結(jié)點調(diào)整完      }    }  }  void HeapSort(){   while(n>2){         //保證有雙親結(jié)點      Adjust();        //調(diào)整大根堆函數(shù)     Swap(&b[1],&b[n-1]);  //將最后一個葉子結(jié)點和根結(jié)點交換      n--;          //裁剪最后的葉子結(jié)點    } }       int main(void){   int i,m;   cout<<"請輸入數(shù)據(jù)的總數(shù)【0單元不要,實際元素個數(shù)為(n-1)個】:"<<endl;   cin>>n;   m=n;   cout<<"請輸入各個數(shù)據(jù)【0單元不要,實際元素個數(shù)為(n-1)個】:"<<endl;   b[0]=0;   for(i=1;i<n;i++){     cin>>b[i];   }   HeapSort();           //堆排序   cout<<"大根堆升序排列為:"<<endl;   for(i=1;i<m;i++){     cout<<b[i]<<" ";   }    cout<<endl;   return 0; } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 开江县| 台北县| 萝北县| 子洲县| 泰兴市| 西昌市| 达州市| 新河县| 自贡市| 乌审旗| 吉安市| 岐山县| 桃源县| 禄丰县| 宝鸡市| 张家界市| 仲巴县| 奉节县| 蒙山县| 永善县| 新建县| 温宿县| 鲁山县| 容城县| 土默特右旗| 叶城县| 永靖县| 辽中县| 连城县| 光山县| 西乡县| 永顺县| 长治县| 彭水| 永宁县| 大埔县| 沁水县| 诏安县| 沅江市| 襄樊市| 织金县|