亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

深入理解堆排序及其分析

2020-01-26 16:09:18
字體:
來源:轉載
供稿:網友

記得在學習數據結構的時候一味的想用代碼實現算法,重視的是寫出來的代碼有一個正確的輸入,然后有一個正確的輸出,那么就很滿足了。從網上看了許多的代碼,看了之后貌似懂了,自己寫完之后也正確了,但是不久之后就忘了,因為大腦在回憶的時候,只依稀記得代碼中的部分,那么的模糊,根本不能再次寫出正確的代碼,也許在第一次寫的時候是因為參考了別人的代碼,看過之后大腦可以進行短暫的高清晰記憶,于是欺騙了我,以為自己寫出來的,滿足了成就感??墒谴a是計算機識別的,而我們更喜歡文字,圖像。所以我們在學習算法的時候要注重算法的原理以及算法的分析,用文字,圖像表達出來,然后當需要用的時候再將文字轉換為代碼。記憶分為三個步驟:編碼,存儲和檢索,就以學習為例,先理解知識,再歸納知識,最后鞏固知識,為了以后的應用而方便檢索知識。

堆排序過程
堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大于其父節點的值,即A[PARENT[i]] >= A[i]。在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。

既然是堆排序,自然需要先建立一個堆,而建堆的核心內容是調整堆,使二叉樹滿足堆的定義(每個節點的值都不大于其父節點的值)。調堆的過程應該從最后一個非葉子節點開始,假設有數組A = {1, 3, 4, 5, 7, 2, 6, 8, 0}。那么調堆的過程如下圖,數組下標從0開始,A[3] = 5開始。分別與左孩子和右孩子比較大小,如果A[3]最大,則不用調整,否則和孩子中的值最大的一個交換位置,在圖1中是A[7] > A[3] > A[8],所以A[3]與A[7]對換,從圖1.1轉到圖1.2。

image

所以建堆的過程就是

復制代碼 代碼如下:

for ( i = headLen/2; i >= 0; i++)

        do AdjustHeap(A, heapLen, i)


建堆完成之后,堆如圖1.7是個大根堆。將A[0] = 8 與 A[heapLen-1]交換,然后heapLen減一,如圖2.1,然后AdjustHeap(A, heapLen-1, 0),如圖2.2。如此交換堆的第一個元
素和堆的最后一個元素,然后堆的大小heapLen減一,對堆的大小為heapLen的堆進行調堆,如此循環,直到heapLen == 1時停止,最后得出結果如圖3。

image

image

復制代碼 代碼如下:

/*
     輸入:數組A,堆的長度hLen,以及需要調整的節點i
     功能:調堆
 */

 void AdjustHeap(int A[], int hLen, int i)
 {
     int left = LeftChild(i);  //節點i的左孩子
     int right = RightChild(i); //節點i的右孩子節點
     int largest = i;
     int temp;

     while(left < hLen || right < hLen)
     {
         if (left < hLen && A[largest] < A[left])
         {
             largest = left;
         }

         if (right < hLen && A[largest] < A[right])
         {
             largest = right;
         }

         if (i != largest)   //如果最大值不是父節點
         {
              temp = A[largest]; //交換父節點和和擁有最大值的子節點交換
              A[largest] = A[i];
              A[i] = temp;

             i = largest;         //新的父節點,以備迭代調堆
             left = LeftChild(i);  //新的子節點
             right = RightChild(i);
         }
         else
         {
             break;
         }
     }
 }

 /*
     輸入:數組A,堆的大小hLen
     功能:建堆
 */
 void BuildHeap(int A[], int hLen)
 {
     int i;
     int begin = hLen/2 - 1;  //最后一個非葉子節點
     for (i = begin; i >= 0; i--)
     {
         AdjustHeap(A, hLen, i); 
     }
 }

 /*
     輸入:數組A,待排序數組的大小aLen
     功能:堆排序
 */
 void HeapSort(int A[], int aLen)
 {
     int hLen = aLen;
     int temp;

     BuildHeap(A, hLen);      //建堆

     while (hLen > 1)
     {
         temp = A[hLen-1];    //交換堆的第一個元素和堆的最后一個元素
         A[hLen-1] = A[0];
         A[0] = temp;
         hLen--;        //堆的大小減一
         AdjustHeap(A, hLen, 0);  //調堆
     }
 }

性能分析
•調堆:上面已經分析了,調堆的運行時間為O(h)。
•建堆:每一層最多的節點個數為n1 = ceil(n/(2^(h+1))),

image

因此,建堆的運行時間是O(n)。
•循環調堆(代碼67-74),因為需要調堆的是堆頂元素,所以運行時間是O(h) = O(floor(logn))。所以循環調堆的運行時間為O(nlogn)。
總運行時間T(n) = O(nlogn) + O(n) = O(nlogn)。對于堆排序的最好情況與最壞情況的運行時間,因為最壞與最好的輸入都只是影響建堆的運行時間O(1)或者O(n),而在總體時間中占重要比例的是循環調堆的過程,即O(nlogn) + O(1) =O(nlogn) + O(n) = O(nlogn)。因此最好或者最壞情況下,堆排序的運行時間都是O(nlogn)。而且堆排序還是原地算法(in-place algorithm)。

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久国产免费| 自拍偷拍亚洲精品| 91精品国产九九九久久久亚洲| 国产精品欧美激情| 久久99国产综合精品女同| 影音先锋欧美精品| 亚洲男人av在线| 欧美在线视频一区二区| 亚洲国产精品一区二区久| 色狠狠久久aa北条麻妃| 日韩精品一区二区视频| 日韩www在线| 伊人成人开心激情综合网| 欧美高清视频在线播放| 国产激情久久久| 久久99国产精品久久久久久久久| 成人春色激情网| 91在线视频免费| 91av视频在线观看| 精品久久在线播放| 91免费看片在线| 亚洲丝袜一区在线| 精品久久香蕉国产线看观看亚洲| 日韩美女写真福利在线观看| 伊人激情综合网| 日韩网站在线观看| 麻豆国产精品va在线观看不卡| 成人精品aaaa网站| 久久久爽爽爽美女图片| 在线免费观看羞羞视频一区二区| 5566成人精品视频免费| 亚洲国产高潮在线观看| 久久精品久久久久久| 美女精品视频一区| 免费不卡欧美自拍视频| 久久精品国产欧美激情| 国产欧美一区二区三区久久| 日韩成人免费视频| 色无极亚洲影院| 成人高h视频在线| 亚洲社区在线观看| 亚洲黄色av网站| 北条麻妃99精品青青久久| 欧美性猛交xxxx乱大交极品| 中文字幕精品av| 欧洲亚洲免费视频| 国产精品黄色av| 国产第一区电影| 成人妇女淫片aaaa视频| 亚洲最新av在线网站| 性欧美办公室18xxxxhd| 久久久久久久激情视频| 久久久97精品| 国产精品日韩欧美大师| 97国产一区二区精品久久呦| 国产www精品| 中文字幕久久久av一区| 51久久精品夜色国产麻豆| 国产精品美女主播| 中文字幕欧美在线| 中文字幕在线精品| 久久精品欧美视频| 国内精品一区二区三区| 日韩精品中文字幕有码专区| 最近免费中文字幕视频2019| 日韩在线视频观看正片免费网站| 国产日韩欧美综合| 久久久噜噜噜久噜久久| 麻豆国产精品va在线观看不卡| 日本精品免费一区二区三区| 精品国产鲁一鲁一区二区张丽| 国产成人精品免费久久久久| 久久久久久高潮国产精品视| 一区二区国产精品视频| 高跟丝袜一区二区三区| 国产成人精品久久久| 91精品国产综合久久香蕉922| 国产亚洲一区二区精品| 久久av中文字幕| 69久久夜色精品国产69| 国产精品日本精品| 91福利视频在线观看| 韩日欧美一区二区| 亚洲**2019国产| 成人国产在线激情| 久久精品视频亚洲| 久久久久久网址| 欧美一区深夜视频| 丰满岳妇乱一区二区三区| 国产精品流白浆视频| 亚洲丁香婷深爱综合| www.欧美三级电影.com| 日本午夜人人精品| 久久九九全国免费精品观看| 亚洲天堂一区二区三区| 8090理伦午夜在线电影| 国产一区二区日韩精品欧美精品| 国产欧美精品一区二区| 激情成人在线视频| 久久综合色88| 97色在线视频观看| 亚洲色图第一页| 亚洲**2019国产| 亚洲欧美资源在线| 国产精品免费一区二区三区都可以| 国产精品日日摸夜夜添夜夜av| 国产精品美女久久久免费| 欧美孕妇毛茸茸xxxx| 亚洲国产成人久久综合一区| 国产99视频精品免视看7| 国产美女精品免费电影| 欧美激情手机在线视频| www.亚洲人.com| 日本伊人精品一区二区三区介绍| 亚洲欧美三级伦理| 国产日韩欧美在线| 欧美体内谢she精2性欧美| 欧美黑人国产人伦爽爽爽| 在线日韩日本国产亚洲| 成人亚洲欧美一区二区三区| 91麻豆国产精品| 国产视频福利一区| 成人午夜高潮视频| 亚洲欧美自拍一区| 亚洲国产欧美自拍| 国产精品一区二区久久久久| 国产欧美在线看| 欧美大全免费观看电视剧大泉洋| 国模叶桐国产精品一区| 亚洲成人教育av| 亚洲四色影视在线观看| 国产精品电影观看| 亚洲午夜色婷婷在线| 午夜精品国产精品大乳美女| 清纯唯美亚洲综合| 亚洲国产精品va在线观看黑人| 欧美体内谢she精2性欧美| 欧美中文在线观看国产| 成人久久一区二区三区| 久久精品国产96久久久香蕉| 96精品视频在线| 久操成人在线视频| 国产丝袜精品第一页| 亚洲第一网中文字幕| 有码中文亚洲精品| 欧美日本高清视频| 欧美电影在线免费观看网站| 亚洲第一网站男人都懂| 久久久久久噜噜噜久久久精品| 日韩禁在线播放| 国产日韩亚洲欧美| 亚洲国产欧美一区二区丝袜黑人| 91精品国产高清久久久久久91| 91大神福利视频在线| 亚洲男人的天堂网站| 国产精品成人免费电影| 亚洲欧洲高清在线| 国产精品999| 久久久中文字幕| 97久久精品视频| 欧美日韩精品在线视频| 国产精品久久久久久网站| 68精品国产免费久久久久久婷婷| 91精品免费久久久久久久久|