演算法珠璣 再看堆排序 Heap Sort 的實現

2021-08-27 10:24:46 字數 1599 閱讀 8307

主機平台:gentoo linux withkernel linux 3.4.36-gentoo

編譯器版本:gcc (gentoo 4.6.3 p1.9, pie-0.5.2) 4.6.3

堆排序(heap sort)堆排序(heapsort)是一樹形選擇排序。堆排序的特點是:在排序過程中,將r[l..n]看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大(或最小)的記錄.

堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

堆排序是就地排序,輔助空間為o(1),

它是不穩定的排序方法。

如果需求是從很大的資料中選取特定的幾個最大活最小值,那麼堆排序是最好的選擇。

堆排序的基本步驟就是:

1.初始建堆

2.將堆頂元素與有序區的第乙個元素交換

3.然後對堆頂元素開始調整堆,跳轉到2執行。直到全部有序。

宣告:下面演算法的實現中,陣列的儲存位於data[1]-------data[n]

該演算法中最核心的演算法是堆的調整演算法:

//堆調整

//data,要排序的陣列

//target,要調整的元素位置

//n,陣列大小

void adjustheap(int data,int target,int n)

if(ntemp < data[nchild])//孩子節點比父節點大,則進行孩子節點移到父節點的位置

else break;

} data[target] = ntemp;//最後將要調整的元素放到合適的位置

}

整體實現**:

/****************

* 堆排序演算法

* 排序陣列下標從1開始

*/#include enum;

int data[max];

static inline swap(int x,int y)

//堆調整

//data,要排序的陣列

//target,要調整的元素位置

//n,陣列大小

void adjustheap(int data,int target,int n)

if(ntemp < data[nchild])

else break;

} data[target] = ntemp;//最後將要調整的元素放到合適的位置

}//堆排序演算法

//data,要排序的陣列

//n,陣列大小

void heapsort(int data,int n)

//每次迴圈將堆頂元素與有序區第乙個元素交換,然後再調整堆

for(i = n;i > 1;--i) }

int main()

//stderr("開始排序\n");

heapsort(data,max);

//stderr("排序結束\n");

for(i = 1;i <= max;++i)

return 0;

}

排序演算法 堆排序

1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...

排序演算法 堆排序

花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...

排序演算法 堆排序

由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...