堆排序:一種
樹形選擇排序
,是對直接選擇排序的有效改進。
綜上描述,它的實現需要解決兩個問題:
1、如何由乙個無序序列構建成乙個堆?
2、如何在輸出堆頂元素後,調整剩餘元素成為乙個新的堆?
無序序列構建成乙個堆的**如下:
/**
* 初始堆進行調整
* 將l->ielem[0..length-1]建成堆
* 調整完之後第乙個元素是序列的最小的元素
*/
void buildingheap(sqlist* l)
void heapadjust(sqlist* l,int s, int length)
if(l->ielem[s]ielem[child]) // 如果較大的子結點大於父結點
else // 如果當前待調整結點大於它的左右孩子,則不需要調整,直接退出
l->ielem[s] = tmp; // 當前待調整的結點放到比其大的孩子結點位置上
} printlist(*l);
}
將堆頂元素輸出,即與最後乙個元素進行交換,然後
調整剩餘元素成為乙個新的堆
//從最後乙個元素開始對序列進行調整
for (int i = l->ilength - 1; i > 0; --i)
整體**實現如下:
#include #include using namespace std;
#define max_size 9
typedef struct
sqlist;
void printlist(sqlist l)
;
for (i=0; iielem[i] = rand()%100;
l->ielem[i] = idata[i];
l->ilength++;
}
printlist(*l);
} void swap(sqlist* l,int a,int b)
void heapadjust(sqlist* l,int s, int length)
if(l->ielem[s]ielem[child]) // 如果較大的子結點大於父結點
else // 如果當前待調整結點大於它的左右孩子,則不需要調整,直接退出
l->ielem[s] = tmp; // 當前待調整的結點放到比其大的孩子結點位置上
} printlist(*l);
} /**
* 初始堆進行調整
* 將l->ielem[0..length-1]建成堆
* 調整完之後第乙個元素是序列的最小的元素
*/
void buildingheap(sqlist* l)
/**
* 堆排序演算法
*/
void heapsort(sqlist* l)
}
int main()
執行結果:
常用排序演算法總結7一一堆排序
在了解堆排序之前,我們有必要清楚 什麼是堆呢?堆 英語 heap 是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。在佇列中,排程程式反覆提取佇列中第乙個作業並執行,因為實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性的作業,同樣應當具有優...
排序演算法一 堆排序
一 演算法介紹 堆排序 heapsort 是指利用堆積樹 堆 這種 資料結構 所設計的一種 排序演算法 它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是 完全二叉樹 大根堆的要求是每個節點的值都不大於其父節點的值,即 a parent i a i 在陣列的非降...
堆(資料結構)及堆排序
這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...