我的代碼:
void choose(int *a, int n) {
int i, j, min, temp;
int k = 1;
for (i = 1; i < n; i++) {
min = a[k];
for (j = i; j <= n; j++) {
if (a[j] < min) {
temp = a[j];
a[j] = min;
min = temp;
}
}
temp = min;
min = a[k];
a[k] = temp;
k = k + 1;
}
}
答案代碼:
void selection_sort(int *a,int n){
int i,j,temp,min;
for(i = 1; i< n;i++){
min = i;
for(j = i+1; j <= n;j++){
if(a[j] < a[i]){
min = j;
}
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
差異及總結(jié):
①保存數(shù)組中的有些數(shù)值無需一定要記錄這個(gè)數(shù)字进陡,有時(shí)候僅需保存該數(shù)字的下標(biāo)即可
②學(xué)會(huì)充分利用循環(huán)中的i褐隆,j這樣的變量芙盘,有時(shí)候無需向我一開始自己算法中一樣申請(qǐng)一個(gè)多余的變量k
我對(duì)選擇排序的理解:
選擇排序是一個(gè)不斷尋找該數(shù)組中最卸勾濉(最大)值的過程液兽,將第i次尋找出的最小(大)值與array[i]交換位置你画,注意剩下最后一個(gè)數(shù)字的時(shí)候無需再找抵碟,該剩下的數(shù)一定是該數(shù)組中最大(刑已)的數(shù),因?yàn)樵撍惴ǖ脑砟獯琣rray[length-1]是你在array[length-1]和array[length]中找出的較小值撬统。
時(shí)間復(fù)雜度和空間復(fù)雜度:
空間:
O(1) 沒有申請(qǐng)其他需要的空間
時(shí)間:
最好情況和最壞情況下的差別在于是否執(zhí)行min = j這行代碼,不會(huì)影響其最大次方項(xiàng)敦迄,以及交
換算法也只影響n這個(gè)項(xiàng)數(shù)的大小恋追,不影響最大項(xiàng)數(shù)大小
該算法兩層for循環(huán)的第二次大致為1+2+3+....+n-1的累加,由等差數(shù)列求和可知其時(shí)間復(fù)雜度
為O(n^2)
查閱相關(guān)資料:
最好情況為sorted (n?1)((n+2)/2+4)
最壞情況為reversed (n?1)(n+6)
至于該排序方法穩(wěn)定與否罚屋,看最壞和最好都是O(n^2)苦囱,這樣應(yīng)該算是穩(wěn)定了吧?