一 概述
設(shè)所排序序列的記錄個(gè)數(shù)為n,i 取 1,2,…,n-1 。 從所有n-i+1個(gè)記錄(Ri,Ri+1,…,Rn)中找出排序碼最小(或最大)的記錄,與第i個(gè)記錄交換。執(zhí)行n-1趟 后就完成了記錄序列的排序。
二 性能分析
在簡(jiǎn)單選擇排序過(guò)程中,所需移動(dòng)記錄的次數(shù)比較少。
最好情況下,即待排序記錄初始狀態(tài)就已經(jīng)是正序排列了,則不需要移動(dòng)記錄?!?
最壞情況下,即待排序記錄初始狀態(tài)是按第一條記錄最大,之后的記錄從小到大順序排列,則需要移動(dòng)記錄的次數(shù)最多為3(n-1)。
簡(jiǎn)單選擇排序過(guò)程中需要進(jìn)行的比較次數(shù)與初始狀態(tài)下待排序的記錄序列的排列情況無(wú)關(guān)。
當(dāng)i=1時(shí),需進(jìn)行n-1次比較;
當(dāng)i=2時(shí),需進(jìn)行n-2次比較;
依次類推,共需要進(jìn)行的比較次數(shù)是(n-1)+(n-2)+…+2+1=n(n-1)/2,即進(jìn)行比較操作的時(shí)間復(fù)雜度為O(n^2),進(jìn)行移動(dòng)操作的時(shí)間復(fù)雜度為O(n)。
簡(jiǎn)單選擇排序是不穩(wěn)定排序。
三 程序?qū)嵺`
以排序數(shù)組{3,2,1,4,6,5}為例
static int selectSort(int[] a, int length){
if (a == null || length <= 1){
return -1;
}
if (length > a.length){
return -1;
}
for (int i = 0; i < length; i++){
int min = a[i];
int index = 0;
for (int j = i + 1; j < length; j++){
if (a[j] < min){
min = a[j];
index = j;
}
}
if (index > 0){
int tmp = a[i];
a[i] = a[index];
a[index] = tmp;
}
}
return 0;
}