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

首頁 > 編程 > C > 正文

C語言實現基于最大堆和最小堆的堆排序算法示例

2020-01-26 14:33:50
字體:
來源:轉載
供稿:網友

堆定義
堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2](小頂堆)或者:Key[i]>=Key[2i+1]&&key>=key[2i+2](大頂堆)
即任何一非葉節點的關鍵字不大于或者不小于其左右孩子節點的關鍵字。

堆排序的思想
利用大頂堆(小頂堆)堆頂記錄的是最大關鍵字(最小關鍵字)這一特性,使得每次從無序中選擇最大記錄(最小記錄)變得簡單。

  • 最大堆:所有節點的子節點比其自身小的堆。
  • 最小堆:所有節點的子節點比其自身大的堆。

這里以最大堆為基礎,其基本思想為:

1.將初始待排序關鍵字序列(R1,R2....Rn)構建成大頂堆,此堆為初始的無序區;
2.將堆頂元素R[1]與最后一個元素R[n]交換,此時得到新的無序區(R1,R2,......Rn-1)和新的有序區(Rn),且滿足R[1,2...n-1]<=R[n];
3.由于交換后新的堆頂R[1]可能違反堆的性質,因此需要對當前無序區(R1,R2,......Rn-1)調整為新堆,然后再次將R[1]與無序區最后一個元素交換,得到新的無序區(R1,R2....Rn-2)和新的有序區(Rn-1,Rn)。不斷重復此過程直到有序區的元素個數為n-1,則整個排序過程完成。

C語言實現
1.基于最大堆實現升序排序

// 初始化堆void initHeap(int a[], int len) { // 從完全二叉樹最后一個非子節點開始 // 在數組中第一個元素的索引是0 // 第n個元素的左孩子為2n+1,右孩子為2n+2, // 最后一個非子節點位置在(n - 1) / 2 for (int i = (len - 1) / 2; i >= 0; --i) {  adjustMaxHeap(a, len, i); }} void adjustMaxHeap(int a[], int len, int parentNodeIndex) { // 若只有一個元素,那么只能是堆頂元素,也沒有必要再排序了 if (len <= 1) {  return; }  // 記錄比父節點大的左孩子或者右孩子的索引 int targetIndex = -1;  // 獲取左、右孩子的索引 int leftChildIndex = 2 * parentNodeIndex + 1; int rightChildIndex = 2 * parentNodeIndex + 2;  // 沒有左孩子 if (leftChildIndex >= len) {  return; }  // 有左孩子,但是沒有右孩子 if (rightChildIndex >= len) {  targetIndex = leftChildIndex; } // 有左孩子和右孩子 else {  // 取左、右孩子兩者中最大的一個  targetIndex = a[leftChildIndex] > a[rightChildIndex] ? leftChildIndex : rightChildIndex; }  // 只有孩子比父節點的值還要大,才需要交換 if (a[targetIndex] > a[parentNodeIndex]) {  int temp = a[targetIndex];    a[targetIndex] = a[parentNodeIndex];  a[parentNodeIndex] = temp;      // 交換完成后,有可能會導致a[targetIndex]結點所形成的子樹不滿足堆的條件,  // 若不滿足堆的條件,則調整之使之也成為堆  adjustMaxHeap(a, len, targetIndex); }} void heapSort(int a[], int len) { if (len <= 1) {  return; }  // 初始堆成無序最大堆 initHeap(a, len);  for (int i = len - 1; i > 0; --i) {  // 將當前堆頂元素與最后一個元素交換,保證這一趟所查找到的堆頂元素與最后一個元素交換  // 注意:這里所說的最后不是a[len - 1],而是每一趟的范圍中最后一個元素  // 為什么要加上>0判斷?每次不是說堆頂一定是最大值嗎?沒錯,每一趟調整后,堆頂是最大值的  // 但是,由于len的范圍不斷地縮小,導致某些特殊的序列出現異常  // 比如說,5, 3, 8, 6, 4序列,當調整i=1時,已經調整為3,4,5,6,8序列,已經有序了  // 但是導致了a[i]與a[0]交換,由于變成了4,3,5,6,8反而變成無序了!  if (a[0] > a[i]) {   int temp = a[0];   a[0] = a[i];   a[i] = temp;  }    // 范圍變成為:  // 0...len-1  // 0...len-1-1  // 0...1 // 結束  // 其中,0是堆頂,每次都是找出在指定的范圍內比堆頂還大的元素,然后與堆頂元素交換  adjustMaxHeap(a, i - 1, 0); }}

2.基于最小堆實現降序排序

// 初始化堆void initHeap(int a[], int len) { // 從完全二叉樹最后一個非子節點開始 // 在數組中第一個元素的索引是0 // 第n個元素的左孩子為2n+1,右孩子為2n+2, // 最后一個非子節點位置在(n - 1) / 2 for (int i = (len - 1) / 2; i >= 0; --i) {  adjustMinHeap(a, len, i); }} void adjustMinHeap(int a[], int len, int parentNodeIndex) { // 若只有一個元素,那么只能是堆頂元素,也沒有必要再排序了 if (len <= 1) {  return; }  // 記錄比父節點大的左孩子或者右孩子的索引 int targetIndex = -1;  // 獲取左、右孩子的索引 int leftChildIndex = 2 * parentNodeIndex + 1; int rightChildIndex = 2 * parentNodeIndex + 2;  // 沒有左孩子 if (leftChildIndex >= len) {  return; }  // 有左孩子,但是沒有右孩子 if (rightChildIndex >= len) {  targetIndex = leftChildIndex; } // 有左孩子和右孩子 else {  // 取左、右孩子兩者中最上的一個  targetIndex = a[leftChildIndex] < a[rightChildIndex] ? leftChildIndex : rightChildIndex; }  // 只有孩子比父節點的值還要小,才需要交換 if (a[targetIndex] < a[parentNodeIndex]) {  int temp = a[targetIndex];    a[targetIndex] = a[parentNodeIndex];  a[parentNodeIndex] = temp;      // 交換完成后,有可能會導致a[targetIndex]結點所形成的子樹不滿足堆的條件,  // 若不滿足堆的條件,則調整之使之也成為堆  adjustMinHeap(a, len, targetIndex); }} void heapSort(int a[], int len) { if (len <= 1) {  return; }  // 初始堆成無序最小堆 initHeap(a, len);  for (int i = len - 1; i > 0; --i) {  // 將當前堆頂元素與最后一個元素交換,保證這一趟所查找到的堆頂元素與最后一個元素交換  // 注意:這里所說的最后不是a[len - 1],而是每一趟的范圍中最后一個元素  // 為什么要加上>0判斷?每次不是說堆頂一定是最小值嗎?沒錯,每一趟調整后,堆頂是最小值的  // 但是,由于len的范圍不斷地縮小,導致某些特殊的序列出現異常  // 比如說,5, 3, 8, 6, 4序列,當調整i=1時,已經調整為3,4,5,6,8序列,已經有序了  // 但是導致了a[i]與a[0]交換,由于變成了4,3,5,6,8反而變成無序了!  if (a[0] < a[i]) {   int temp = a[0];   a[0] = a[i];   a[i] = temp;  }    // 范圍變成為:  // 0...len-1  // 0...len-1-1  // 0...1 // 結束  // 其中,0是堆頂,每次都是找出在指定的范圍內比堆頂還小的元素,然后與堆頂元素交換  adjustMinHeap(a, i - 1, 0); }}

3.C語言版測試

大家可以測試一下:

// int a[] = {5, 3, 8, 6, 4};int a[] = {89,-7,999,-89,7,0,-888,7,-7};heapSort(a, sizeof(a) / sizeof(int)); for (int i = 0; i < sizeof(a) / sizeof(int); ++i) {  NSLog(@"%d", a[i]);}

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97国产一区二区精品久久呦| 亚洲国产精品成人va在线观看| 成人激情综合网| 成人国内精品久久久久一区| 91免费在线视频网站| 伊人av综合网| 永久免费看mv网站入口亚洲| 国产啪精品视频网站| 久久天天躁日日躁| 亚洲第一色在线| 国产精品jizz在线观看麻豆| 久久偷看各类女兵18女厕嘘嘘| 欧美又大又粗又长| 亚洲国产精品999| 亚洲一区二区三区在线视频| 久久九九全国免费精品观看| 精品日韩中文字幕| 欧美在线中文字幕| 正在播放欧美一区| 国产丝袜一区视频在线观看| 欧美猛交ⅹxxx乱大交视频| 国产精品日韩电影| 中文字幕精品一区二区精品| 日韩欧亚中文在线| 色99之美女主播在线视频| 狠狠综合久久av一区二区小说| 国产精品久久久999| 北条麻妃一区二区三区中文字幕| 91天堂在线观看| 538国产精品一区二区免费视频| 国产精品美女主播在线观看纯欲| 久久人体大胆视频| 欧美成人小视频| 亚洲国产女人aaa毛片在线| 国产精品日韩欧美综合| 欧美大胆a视频| 亚洲午夜精品久久久久久性色| 国产精品久久久久久久久久久久久久| 欧美精品久久久久久久| 久久久久久免费精品| 欧美黑人极品猛少妇色xxxxx| 九九久久久久久久久激情| 最近中文字幕日韩精品| 成人日韩在线电影| 欧美乱大交xxxxx另类电影| 久久亚洲春色中文字幕| 影音先锋欧美精品| 亚洲一区999| 国产精品jvid在线观看蜜臀| 久久久久久成人精品| 国产精品久久久久久久美男| www.亚洲天堂| 亚洲欧美日韩成人| 国产国语videosex另类| 国产精品91久久久| 热久久免费视频精品| 欧美成人剧情片在线观看| 国产女同一区二区| 欧美国产精品人人做人人爱| 精品综合久久久久久97| 色中色综合影院手机版在线观看| 伊人一区二区三区久久精品| 国产一区二区黑人欧美xxxx| 精品久久久久久久大神国产| 在线激情影院一区| 欧美午夜电影在线| 亚洲伊人久久综合| 97精品一区二区三区| 原创国产精品91| 日本国产高清不卡| 美日韩精品视频免费看| 97久久精品在线| 岛国av一区二区三区| 久久精品国产成人精品| 亚洲经典中文字幕| 亚洲福利影片在线| 欧美国产在线视频| 日韩欧美主播在线| 亚洲大胆人体av| 亚洲色图色老头| 欧洲美女免费图片一区| 亚洲第一福利网| 国产香蕉一区二区三区在线视频| 国产精品∨欧美精品v日韩精品| 久久97精品久久久久久久不卡| 日韩精品久久久久久久玫瑰园| 91欧美日韩一区| 欧美在线观看日本一区| 日韩网站在线观看| 亚洲www在线观看| 国产精品香蕉在线观看| 伊人伊人伊人久久| 亚洲精品www久久久久久广东| 永久555www成人免费| 日韩欧美高清视频| 日韩激情av在线免费观看| 国产精品一二三视频| 日韩免费视频在线观看| 亚洲精品网站在线播放gif| 成人h片在线播放免费网站| 欧美日韩国产在线播放| 国产精品福利在线观看| 国产亚洲精品久久久久动| 狠狠色狠狠色综合日日小说| 久久久久五月天| 日韩av手机在线| 中文一区二区视频| 欧美性xxxx18| 亚洲精品理论电影| 久久精品国产一区二区三区| 亚洲电影免费观看| 久久精品国产亚洲精品| 午夜免费在线观看精品视频| yw.139尤物在线精品视频| 久久福利视频网| 美日韩丰满少妇在线观看| 亚洲欧美制服另类日韩| 亚洲激情视频网站| 欧美日韩激情视频8区| 国产69精品久久久| 国产福利精品视频| 亚洲男人天堂古典| 色一区av在线| 一区二区三区 在线观看视| 日本精品性网站在线观看| 日韩中文字幕在线看| 国产精品久久97| 亚洲精品720p| 尤物九九久久国产精品的分类| 国产日韩欧美91| 亚洲午夜av电影| 欧美俄罗斯性视频| 国产精品69久久久久| 亚洲精品www久久久| 精品日本高清在线播放| 欧美午夜激情在线| 国产精品毛片a∨一区二区三区|国| 久久99久久久久久久噜噜| 国产亚洲欧美视频| 亚洲第一精品福利| 成人福利在线视频| 欧美尺度大的性做爰视频| 久久久精品日本| 欧美日韩国产123| 国产精品久久久久秋霞鲁丝| 亚洲精品电影网| 日韩精品在线观看视频| 91九色视频在线| 亚洲欧美一区二区精品久久久| 日韩中文字幕av| 成人网在线视频| 琪琪亚洲精品午夜在线| 亚洲男人天堂手机在线| 国产精品成人免费电影| 97在线观看视频国产| 在线视频一区二区| 尤物yw午夜国产精品视频明星| 色婷婷av一区二区三区在线观看| 中日韩美女免费视频网址在线观看| 精品magnet| 国产成人激情视频| 国产精品2018| 国产丝袜精品视频| 久久在精品线影院精品国产|