資料結構一一堆排序

2021-08-15 03:38:04 字數 1784 閱讀 2697

堆排序:一種

樹形選擇排序

,是對直接選擇排序的有效改進。

綜上描述,它的實現需要解決兩個問題:

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 在陣列的非降...

堆(資料結構)及堆排序

這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...