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