經典排序演算法之二 選擇排序

2021-10-09 12:27:16 字數 1010 閱讀 3087

思想:假設給定乙個大小為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...