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

首頁 > 編程 > C > 正文

堆排序算法(選擇排序改進)

2020-01-26 15:38:31
字體:
來源:轉載
供稿:網友

首先要理解堆的含義:要么所有節點都不大于其子孩子節點數據,要么都不小于其子孩子節點數據

堆排序的核心思想:就是要滿足所有節點都滿足上面兩點,如何完成,看下面

堆排序的步驟:

1.首先要建成一個大頂堆或者小頂堆,在建的過程中其實就是調整節點的位置,首先要從最后最后一個節點的母親節點開始,按照堆的含義調整。為什么不是最后一個或者其他?因為要保證完整性和不必要性,所以只需從最后一個的母親節點開始即可(下面的堆默認存在順序結構,從索引0開始的,所以有些二叉樹的特性請查閱二叉樹),直至索引節點為0的節點。調整完成后即成為一個堆,但是這里的數據并沒有排序好,所以下一部調整順序。

2.從最后一個數據開始,與第一個數據進行交換,然后按照堆的含義調整第一個數據。為什么先選擇最后一個數據?因為默認情況下,最后一個或者是較大或者是較小,可以滿足調整要求。這時就考慮當前所有數據減去最后一個,因為這個已是最大或者是最小,不必再考慮.。直至調整沒有任何數據,此時已完成排序。

具體圖例不再標識,有此愛好可以參考其他書籍或者網上的介紹,下面看堆排序代碼:

復制代碼 代碼如下:

int HeapSort(MergeType* L)
{
 int i = 0;
 if (!L->elem)
 {
  return -1;
 }

 //創建堆
 for (int i = L->len/2-1; i >= 0; i--)
 {
  HeapAdjust(L, i, L->len-1);
 }

 //堆排序
 for (i = L->len-1; i >= 0; i-- )
 {
  swap(L->elem[i], L->elem[0]);
  HeapAdjust(L, 0, i-1);
 }
 return 0; 
}

注意:
1)由于父子節點的關系,for循環第一個數據索引其實是L,len-1,但是其父母節點(i)與 當前節點(p)的關系:p = 2i+1 或者2i+2; 如果存儲數據的節點第一個索引不是0而是1,這里p=2i或者p=2i+1,請參看有關書籍的證明,所以當前父母節點:i =(p-1)/ 2 = (L.len-1-1)/2 = L.len/2-1

2)由于再次調整數據的時候是從最后一個數據,所以需要交換數據swap,再進行當前頂點數據也就是第一個數據的堆調整,但是此時調整的對象只是(0~i)這些數據,其他已經排序好,所以不再需要調整

下面看一下調整代碼,如下:

復制代碼 代碼如下:

int HeapAdjust(MergeType* L, int nPos, int nEnd)
{
 for (int i = nPos*2+1; i < nEnd ; i = 2*i+1)
 {
  if (L->elem[i] <= L->elem[i+1])
  {
   i++;
  }
  if (L->elem[nPos] >= L->elem[i])
  {
   break;
  }
  swap(L->elem[nPos], L->elem[i]);
  nPos = i;
 }
 return 0;
}

這里使用的是在一個層次上是數據直接交換,其實這不是必須的,因為最后才把數據放到最后的位置,所以也可以使用下面的代碼,減少復制的次數

復制代碼 代碼如下:

int HeapAdjustEx(MergeType* L, int nPos, int nEnd)
{
 int nTempkey = L->elem[nPos];

 for (int i = nPos*2+1; i < nEnd ; i = 2*i+1)
 {
  if (L->elem[i] <= L->elem[i+1])//選出最大的子孩子
  {
   i++;
  }
  if (nTempkey >= L->elem[i]) //如果當前節點大于最大子孩子退出
  {
   break;
  }
  L->elem[nPos] = L->elem[i]; //否則進行數據交換
  nPos = i;
 }
 L->elem[nPos] = nTempkey;
 return 0;
}

這里就可以減少較多的復制操作,也就是俗稱的移動操作次數;這里for循環的起始節點按照上面的推論,子節點應該為p=2i+1,所以第一個應該為2*nPos+1,對應當前要比較節點的做孩子,右孩子為2*nPos+2,也就是左孩子+1,其他請看注釋。
時間復雜度:O(nlogn),分析過程暫略

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97热在线精品视频在线观看| 亚洲综合日韩在线| 伊人伊成久久人综合网小说| 欧美激情久久久久| 国语自产精品视频在线看| 亚洲人永久免费| 国产欧美日韩精品丝袜高跟鞋| 亚洲精品一区二区三区婷婷月| 欧美一级大片视频| 国产精品中文字幕在线观看| 国产成人拍精品视频午夜网站| 国产精品久在线观看| 欧美日韩一区二区免费视频| 播播国产欧美激情| 国产91精品网站| 91精品综合久久久久久五月天| 精品在线欧美视频| 成人午夜黄色影院| 狠狠综合久久av一区二区小说| 欧美怡春院一区二区三区| 精品呦交小u女在线| 午夜欧美大片免费观看| 亚洲精品小视频在线观看| www国产精品视频| 久久人91精品久久久久久不卡| 亚洲欧洲午夜一线一品| 精品无人区乱码1区2区3区在线| 欧美性猛交xxxx免费看漫画| x99av成人免费| 性色av一区二区三区| 久久久av亚洲男天堂| 亚洲精品欧美极品| 怡红院精品视频| 精品久久久久久久久久ntr影视| 久久琪琪电影院| 精品久久久久久中文字幕一区奶水| 国产精品揄拍一区二区| 国产精品成人一区二区| 久久天天躁狠狠躁夜夜躁2014| 精品久久久视频| 日韩国产高清污视频在线观看| 国产午夜精品美女视频明星a级| 国产精品高清在线观看| 69久久夜色精品国产7777| 精品少妇v888av| 国产偷国产偷亚洲清高网站| 国产精品极品美女粉嫩高清在线| 欧美裸体男粗大视频在线观看| 日韩经典一区二区三区| 亚洲国产欧美一区二区丝袜黑人| 精品视频在线播放免| 亚洲国产成人精品一区二区| 久久91超碰青草是什么| 视频在线观看99| 北条麻妃一区二区三区中文字幕| 亚洲天堂视频在线观看| 日韩av中文字幕在线免费观看| 欧美午夜视频在线观看| 久久99青青精品免费观看| 欧美日韩在线视频一区| 在线播放国产一区二区三区| 日韩av网站电影| 国外成人性视频| 国产精品免费电影| 欧美与黑人午夜性猛交久久久| 久久91超碰青草是什么| 久久精品国产成人精品| 亚洲色图国产精品| 亚洲第一色中文字幕| 亚洲精品视频网上网址在线观看| 国产成人久久久| 91老司机在线| 国产激情视频一区| 91国在线精品国内播放| 亚洲欧美日韩国产中文专区| 在线a欧美视频| 欧美成人自拍视频| 色久欧美在线视频观看| 欧美国产日韩一区二区三区| 久久久精品国产| 一区二区欧美在线| 精品视频久久久| 欧美在线不卡区| 九九九热精品免费视频观看网站| 国产成人精品视频| 欧美国产日韩一区二区在线观看| 精品欧美激情精品一区| 国产精品普通话| 日韩va亚洲va欧洲va国产| 国产久一一精品| 欧美日韩一区二区在线播放| 久热精品视频在线观看一区| 国产一区二区三区中文| 亚洲美女喷白浆| 欧美一区二区视频97| 免费99精品国产自在在线| 亚洲欧洲美洲在线综合| 久久久久999| 亚洲免费一在线| 国内成人精品视频| 丝袜美腿精品国产二区| 亚洲欧美中文日韩在线v日本| 91亚洲一区精品| 欧美视频精品一区| 性夜试看影院91社区| 亚洲小视频在线| 在线播放日韩精品| 中文字幕9999| 91精品国产九九九久久久亚洲| 欧美在线视频导航| 成人av番号网| 色综合久久精品亚洲国产| 国产精品自产拍在线观看中文| 国产精品综合网站| 国产精品日日摸夜夜添夜夜av| 在线观看中文字幕亚洲| 欧美性高跟鞋xxxxhd| 亚洲香蕉成视频在线观看| 亚洲一区二区三区四区在线播放| 久久这里只有精品99| 欧美成人一区二区三区电影| 欧洲精品毛片网站| 欧美猛男性生活免费| 亚洲天堂免费在线| 亚洲xxxx妇黄裸体| 亚洲天堂av在线免费观看| 97超级碰碰碰| 亚洲欧美一区二区三区情侣bbw| 97色在线观看| 一本色道久久综合狠狠躁篇怎么玩| 欧美中文在线免费| 亚洲91精品在线观看| 91wwwcom在线观看| 久青草国产97香蕉在线视频| 欧美另类第一页| 久久久天堂国产精品女人| 日本中文字幕不卡免费| 久久国产精品久久久| 欧美精品久久久久久久免费观看| 亚洲女在线观看| 色偷偷av一区二区三区| 成人免费午夜电影| 亚洲欧洲日产国产网站| 久久久久久国产精品美女| 国产精品美女999| 久久成人人人人精品欧| 欧美美女18p| 欧美精品18videosex性欧美| 欧美精品一区在线播放| 中文字幕v亚洲ⅴv天堂| 91av视频在线免费观看| 九色91av视频| 久久久久国产精品一区| 亚洲精品狠狠操| 国产精品丝袜一区二区三区| 国产视频福利一区| 4438全国成人免费| 国产成人精品视频| 日韩在线观看免费全集电视剧网站| 亚洲欧美中文日韩v在线观看| 国产一区二区精品丝袜| 亚洲精品久久7777777| 国产精品日日做人人爱| 久久精品成人一区二区三区|