2 演算法之路 選擇之堆排序

2021-06-23 07:46:50 字數 1550 閱讀 6797

題目:

選擇排序法的概念簡單,每次從未排序部份選一最小值,插入已排序部份的後端,其時間主要花費於在整個未排序部份尋找最小值,如果能讓搜尋最小值的方式加 快,選擇排序法的速率也就可以加快

heap

排序法讓搜尋的路徑由樹根至最後乙個樹葉,而不是整個未排序部份,從而可以加快排序的過程,因而稱之為改良的選擇排序法。

整個堆排序的過程分建堆、取值、調整為新的堆三個過程。分別如下示:(以最小堆積樹為例。關於heaptree請參閱資料結構與演算法) 

建堆

- 演算法

1、 

加至堆積樹的元素會先放置在最後乙個樹葉節點位置

2、 

然後檢查父節點是否小於子節點(最小堆積)

3、 

將小的元素不斷與父節點交換,直到滿足堆積樹的條件為止

取最小值

– 演算法

1、將根節點與最後一葉子結點交換 2

、樹長度減一,調整樹為新的堆積樹

調整為新堆積樹

– 演算法

1、 

比較左孩子節點與右孩子節點,取其較小乙個節點

2、 

比較孩子節點與父節點,若父節點大則交換孩子與父節點,令孩子節點為新的父節點,並求其新的孩子節點;程式進入1.迴圈

sourcecodes

// 建立最小堆積樹- 建堆演算法

// 1. 加至堆積元素先放置在最後乙個葉子節點的位置

// 2. 檢查父節點是否小於子節點,若小,則交換父節點與子節點

// 3. 將父節點設定為新的子節點,同時求其新的父節點,程式進入.迴圈

int creatminheap3(int a,int lens)

} for(i=1;i

// 調整最小堆積樹

// 1. 比較左孩子節點與右孩子節點,取其較小乙個節點

// 2. 比較孩子節點與父節點,若父節點大則交換孩子與父節點,令孩子節點為新的父節點,並求其新的孩子節點,程式進入1.迴圈

int adjustminheap2(int a,int specificlens)

int tail=specificlens;

int parent=1;

int child=2*parent;

while(child+1<=tail)

else break;

} else

else break;

} } return 0;

}

// 堆排序

// 1. 建立最小堆積樹

// 2. 取下最小節點 (交換最小堆積樹的根與最後乙個節點)

// 3. 樹長度減一,調整新的堆為最小堆積樹.

// 4. 程式進入.2迴圈

int heapsort(int a,int lens)

return 0;

}

排序演算法(2) 選擇排序 堆排序

繼續上篇的 交換排序 氣泡排序 快速排序,本篇介紹選擇排序和堆排序 一 選擇排序 非常的簡單直觀,每次找出最小或者最大的值儲存起來,繼續找剩下的值儲存起來,直達最後乙個元素。從arr 0 arr n 中找出最小的值,放在arr 0 此時arr 0 已經排好序 從arr 1 arr n 中找出最小的值...

排序演算法之選擇排序 選擇排序 堆排序

直接選擇排序 如下 下面 是一次迴圈同時挑選出最大和最小數,並將其與左右交換 選擇排序 void selectionsort int a,int len swap a min a left 如果最大數的下標在為left,證明要交換的最大數已經被 換到min小標所表示的位置,只需要將right和min...

排序演算法 之選擇排序(直接選擇排序,堆排序)

一 排序演算法分為 1.插入排序 直接插入排序 希爾排序 2.選擇排序 直接選擇排序 堆排序 3.交換排序 氣泡排序 快速排序 4.歸併排序 二,選擇排序 直接選擇排序 1.演算法 選擇排序 直接選擇排序 void selectsort int a,size t n if a child a par...