**
堆排序的實現
(—)建立初始堆
(二)堆排序
在建立初始堆之前首先要了解一些關於堆的概念,還需要了解一些關於平衡二叉樹的內容
(1)堆的節點數 =n/2; 並且是只舍不入;
(2)最後乙個堆結點=(n/2)-1;
(3)對於任意結點a[x],可以找到它子結點上的內容a[2x+1]和a[2x+2]
(——)建立乙個堆
實現原理:
它考察堆的各個結點並且使之成為乙個堆。這意味著各個結點的值無論何時小於它的子結點的值,都要對此節點與最大的子節點進行交換。對於每個結點,要檢查是否應該改變,並且遞迴檢查引起變化的子節點。
此**重新排列了陣列data內的內容,使各個結點的值都大
於其子結點的值,有效的建立了乙個堆
int i,j,j2,k;
int tmp;
//外迴圈 :考慮所有的結點,從最後乙個開始,直到根部
for(k =(n>>1)-1;k>=0;k--)
//此時,i指向具有最大值的子女
if(tmp
data[j]= data[i];
else
break;
}data[j]= tmp;
}(二)堆排序
實現原理:
取堆的的根節點,也就是陣列中最大的數,把它與陣列中的最後乙個元素交換。這個元素是最後乙個結點最後乙個樹葉的子女。此時,前根元素恰好位於它應在的位置。但是要對新堆進行判斷。方法同建立堆中的內迴圈相同。當新堆的重新判斷完成後,再一次得到根元素,且把它與最後乙個結點的最後乙個頁結點交換。
for(k=n-1;k>0;k--)
if(tmp
data[j]=data[i];
else
break;
}data[j]=tmp;
}for(j=0;j
cout<
}下面是堆排序的完整實現的**示例。
#include
using namespace std;
void heapsort(int *data,int n )
//此時,i指向具有最大值的子女
if(tmp
data[j]= data[i];
else
break;
}data[j]= tmp;
}for(k=n-1;k>0;k--)
if(tmp
data[j]=data[i];
else
break;
}data[j]=tmp;
}for(j=0;j
cout<
}int main()
;heapsort(data,10);
return 0;
}(三)
堆排序的優缺點
其複雜度為o(nlog2n),也適合較小量的資料
優點:(1)平均情形和最壞情形時效率都很高。
(2)執行時占用記憶體較少
缺點:(1)演算法不穩定
排序之堆排序
堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...
排序之堆排序
這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...
排序之堆排序
堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點 1 首先是進行heapify,建立堆 2 從下到上,從右到左的進行heapify構建有序的堆 3 進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟 1 heapify def...