我的代码:
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;
}
}
差异及总结:
①保存数组中的有些数值无需一定要记录这个数字,有时候仅需保存该数字的下标即可
②学会充分利用循环中的i,j这样的变量,有时候无需向我一开始自己算法中一样申请一个多余的变量k
我对选择排序的理解:
选择排序是一个不断寻找该数组中最小(最大)值的过程,将第i次寻找出的最小(大)值与array[i]交换位置,注意剩下最后一个数字的时候无需再找,该剩下的数一定是该数组中最大(小)的数,因为该算法的原理,array[length-1]是你在array[length-1]和array[length]中找出的较小值。
时间复杂度和空间复杂度:
空间:
O(1) 没有申请其他需要的空间
时间:
最好情况和最坏情况下的差别在于是否执行min = j这行代码,不会影响其最大次方项,以及交
换算法也只影响n这个项数的大小,不影响最大项数大小
该算法两层for循环的第二次大致为1+2+3+....+n-1的累加,由等差数列求和可知其时间复杂度
为O(n^2)
查阅相关资料:
最好情况为sorted (n−1)((n+2)/2+4)
最坏情况为reversed (n−1)(n+6)
至于该排序方法稳定与否,看最坏和最好都是O(n^2),这样应该算是稳定了吧?