主機平台: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...