美文网首页
2018-02-07 选择排序-思考比较

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

作者: klaaay | 来源:发表于2018-02-07 19:59 被阅读0次

    我的代码:

    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 选择排序-思考比较

          本文链接:https://www.haomeiwen.com/subject/gcmazxtx.html