八大排序算法(3) 简单选择排序

基本思路

每次选出剩余序列中最小/最大的数、与剩余序列的第一个交换位置。

示例:

// 升序,左起
/*初始值*/    10, 7, 1, 8, 5, 12, 6, 3, 9

/*第1趟*/     1, 7, 10, 8, 5, 12, 6, 3, 9
/*第2趟*/     1, 3, 10, 8, 5, 12, 6, 7, 9
/*第3趟*/     1, 3, 5, 8, 10, 12, 6, 7, 9
/*第4趟*/     1, 3, 5, 6, 10, 12, 8, 7, 9
/*第5趟*/     1, 3, 5, 6, 7, 12, 8, 10, 9
/*第6趟*/     1, 3, 5, 6, 7, 8, 12, 10, 9
/*第7趟*/     1, 3, 5, 6, 7, 8, 9, 10, 12
/*第8趟*/     1, 3, 5, 6, 7, 8, 9, 10, 12
/*第9趟*/     1, 3, 5, 6, 7, 8, 9, 10, 12

代码

void printList(int *l, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", l[i]);
    }
    printf("\n");
}

int main() {
    int list[50] = { 10, 7, 1 , 8, 5, 12, 6, 3, 9};
    printList(list, 9);
    // 简单选择排序,每次选取最小的放最前面
    for (int i = 0; i < 9; i++ ) {
        int minIndex = i;
        for (int j = i+1; j < 9; j++){
            if ( list[j] < list[minIndex]){
                // 替换最小值的 index
                minIndex = j;
            }
        }

        int k = list[i];
        list[i] = list[minIndex];
        list[minIndex] = k;
        printList(list, 9);
    }

    system("pause");
    return 0;
}

进阶 – 二元选择排序

简单选择排序每次循环只选出了一个数, 二元选择排序则同时选出最大最小的元素。
这样外循环只需要 n/2 次就能得到结果。

示例:

// 升序,二选选择排序
/*初始值*/    10, 7, 1, 8, 5, 12, 6, 3, 9

/*第1趟*/     1, 7, 10, 8, 5, 9, 6, 3, 12
/*第2趟*/     1, 3, 7, 8, 5, 9, 6, 10, 12
/*第3趟*/     1, 3, 5, 8, 7, 6, 9, 10, 12
/*第4趟*/     1, 3, 5, 6, 7, 8, 9, 10, 12

代码

int main() {
    int list[50] = { 10, 7, 1 , 8, 5, 12, 6, 3, 9};
    printList(list, 9);
    // 二元选择排序,每次选取最小的放最前面,选最大的放后面
    for (int i = 0; i < 9 / 2; i++) {
        int minIndex = i;
        int maxIndex = i;
        for (int j = i+1; j < 9 - i; j++){
            if ( list[j] < list[minIndex]  ){
                minIndex = j;       // 找出最小
            } else if ( list[j] > list[maxIndex] ){
                maxIndex = j;       // 找出最大
            }
        }

        if ( i != minIndex ){
            int k = list[i];
            list[i] = list[minIndex];
            list[minIndex] = k;

        }

        // 要特别留意 maxIndex == i 的时候,i 可能会被换掉
        if ( maxIndex == i ){
            maxIndex = minIndex;
        }

        int m = list[9 - i - 1];
        list[9 - i - 1] = list[maxIndex];
        list[maxIndex] = m;
        printList(list, 9);
    }

system("pause");
return 0;
}

以上

原文链接 http://blog.csdn.net/u011546766/article/details/74024935

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值