選擇排序演算法的思路是:第一次將集合中最小的數挑選出來放在第乙個位置,第二次將集合中最小的數挑選出來放在第二個位置,依此類推。
例如:我們需要對進行排序
經過第1次迴圈最小位置是:5 結果是:[0, 9, 5, 7, 8, 2, 1, 3, 4, 6];
經過第2次迴圈最小位置是:6 結果是:[0, 1, 5, 7, 8, 2, 9, 3, 4, 6];
經過第3次迴圈最小位置是:5 結果是:[0, 1, 2, 7, 8, 5, 9, 3, 4, 6];
經過第4次迴圈最小位置是:7 結果是:[0, 1, 2, 3, 8, 5, 9, 7, 4, 6];
經過第5次迴圈最小位置是:8 結果是:[0, 1, 2, 3, 4, 5, 9, 7, 8, 6];
經過第6次迴圈最小位置是:5 結果是:[0, 1, 2, 3, 4, 5, 9, 7, 8, 6];
經過第7次迴圈最小位置是:9 結果是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
經過第8次迴圈最小位置是:7 結果是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
經過第9次迴圈最小位置是:8 結果是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
選擇排序演算法初始版本**如下:
//選擇排序演算法
public
static
void
main
(string[
] args)
;int min_pos=0;
for(
int j=
0;j1;j++
)//將最小位置和 陣列中還未排序的第乙個進行交換
int temp= arr[j]
; arr[j]
=arr[min_pos]
; arr[min_pos]
= temp;
system.out.
println
("經過第"
+(j+1)
+"次迴圈最小位置是:"
+min_pos+
" 結果是:"
+arrays.
tostring
(arr));
} system.out.
println
(arrays.
tostring
(arr));
}
我們對**進行一些優化(每次迴圈同時找出最大和最小值分別與未排序得最後乙個位置和第乙個位置進行交換),方法的抽取等操作
public
static
void
main
(string[
] args)
;selectionsort
(arr)
; system.out.
println
(arrays.
tostring
(arr));
}public
static
void
selectionsort
(int
arr)
//將最小位置和 陣列中還未排序的第乙個進行交換
swap
(arr,j,min_pos)
;//將最小位置和 陣列中還未排序的最後乙個進行交換
if(j == max_pos )
else
if(max_pos!=min_pos)
system.out.
println
("經過第"
+(j+1)
+"次迴圈最小位置是:"
+min_pos+
"最大位置是:"
+max_pos+
" 結果是:"
+ arrays.
tostring
(arr));
}}//交換陣列中兩個數的位置
public
static
void
swap
(int
arr,
int i,
int j)
執行結果:
經過第1次迴圈最小位置是:5最大位置是:1 結果是:[0, 6, 5, 7, 8, 2, 1, 3, 4, 9]
經過第2次迴圈最小位置是:6最大位置是:4 結果是:[0, 1, 5, 7, 4, 2, 6, 3, 8, 9]
經過第3次迴圈最小位置是:5最大位置是:3 結果是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
經過第4次迴圈最小位置是:3最大位置是:6 結果是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
寫乙個陣列生成的方法和陣列比較的方法來驗證我們的演算法是否真的正確
/*
驗證器*/
private
static boolean matcher
(int
arr1,
int[
] arr2)
}return
true;}
/* *產生隨機數組
*/public
static
int[
]randomarr
(integer length)
return arr;
}
主方法中呼叫
public
static
void
main
(string[
] args)
經過多次驗證,問題不大 排序演算法 選擇排序及優化版本
在前邊的排序演算法 一 中已經分析過選擇排序,這裡主要是想講解他的優化版本。選擇排序,是通過每次選擇最小的數或者最大的數,然後將它放在它應該出現的位置上。具體實現過程 將0號下標的資料儲存,在之後的數中選擇乙個最小的數,如果最小的數不是0號數,則將最小的數與0號下標的數進行交換 將1號下標的數進行儲...
插入排序,選擇,冒泡,快速排序演算法及優化
一開始只想貼 但是後來發現還是有人看的。所以覺得還是有必要花點時間去寫寫。先定義乙個用於交換兩個數的函式吧。if 0 inline void swap int a,int b else inline void swap int a,int b endif 用於獲得一段 執行時間的巨集,限於windo...
七大排序演算法 選擇排序及優化
在乙個長度為n的無序陣列中,在第一趟遍歷n個資料,找出其中最小的數值與第乙個元素交換,第二趟遍歷剩下的n 1個資料,找出其中最小的數值與第二個元素交換 第n 1趟遍歷剩下的2個資料,找出其中最小的數值與第n 1個元素交換,至此選擇排序完成。時間複雜度o n 2 不穩定的排序 void selects...