思想:假設給定乙個大小為n的陣列,從中選出最大的值(記錄下標)與下標n - i的值進行交換(i∈[1, n - 1],i為迴圈次數),即遍歷一次交換一次,每次遍歷確定乙個最大值。
優化思路:使用一種快速查詢最值的方法可降低選擇排序的時間複雜度,例如使用堆這種資料結構,可在o(logn)的情況下找到最值
普通**,cmp()功能為array[maxindex] - array[begin],swap()功能為交換兩個下標所在值。
for
(int end = array.length -
1; end >
0; end--)}
swap
(maxindex, end)
;}
優化思路**
int heapsize;
@override
protected
void
sort()
while
(heapsize >1)
}private
void
siftdown
(int index)
//拿到字節點最大值放入child後與父節點比較,若子節點大則覆蓋父節點,且將下標移動至原最大子節點處if(
cmpofvalue
((integer) parent,
(integer) child)
<0)
else
break;}
array[index]
= parent;
}
普通**迴圈執行次數(n-1)*(n-1)即o(n²),一次確定乙個最大值,不存在提前退出的情況,最壞與最好的情況一致。
優化**後使用堆這種資料結構,
步驟①原地建堆,複雜度o(logn)
②進行遍歷(複雜度o(n)),將堆頂元素(最大值),與末尾元素交換,進行下濾(保證堆性質,複雜度o(logn))同時減少堆可訪問容量,
故複雜度為o(nlogn)
經典排序演算法系列之二 選擇排序
2.1基本思想 第i趟排序開始時,當前有序區和無序區分別為r 0.i 1 和r i.n 1 該趟排序則是從當前無序區中選出關鍵字最小的記錄r k 將它與無序區的第乙個記錄r i 交換,使得r 0.i 和r i 1.n 1 分別變為新的有序區和無序區,經過i 1趟排序後,整個表遞增有序。2.2演算法思...
經典演算法(二) 選擇排序
昨天我們學習了經典中的經典,氣泡排序,今天我們來學習另乙個經典演算法 選擇排序。一 演算法描述 掃瞄所有的元素,得到最小 最大 的元素,並將最小 最大 的元素與左邊第乙個元素進行交換。再掃瞄除第乙個位置以外的所有元素,得到最小 最大 元素,與左邊第二個元素進行交換,以此類推。如果還不理解 以下以最小...
陣列經典排序演算法(二)選擇排序
如下 選擇排序 找最小值 private static void fun2 for int i 0 i arr.length 1 i int t arr i arr i arr minindex arr minindex t 輸出陣列 for int i arr 找最小值下標 i輪 下標範圍 i到l...