2018-02-07 选择排序-思考比较

我的代码:

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),这样应该算是稳定了吧?

你可能感兴趣的:(2018-02-07 选择排序-思考比较)