六大排序整理——2、选择排序

1、冒泡排序

2、选择排序

原理

初始有一组8个数字的无序数列
在这里插入图片描述
选择排序与冒泡差不多,每一轮直接找到对应位置所需要的值的位置,最后将两个位置上的值进行交换,与冒泡相比省去了每一步都进行交换而只交换最后一次。

  1. 第一轮选择:
    在这里插入图片描述
    假设位置1上的47为最小数,在2-8中寻找比47小的最小的数,记住它的位置。
    在这里插入图片描述
    位置7上的2是2-8中小于47的最小数。
    在这里插入图片描述
    交换位置1和位置7上的数。第一小的数已经在第一的位置上了。

  2. 第二轮选择:
    在这里插入图片描述
    假设位置2上的58为剩下数中的最小数,在3-8中寻找比58小的最小的数,记住它的位置。
    在这里插入图片描述
    位置5上的43是3-8中小于58的最小数。
    在这里插入图片描述
    交换位置2和位置5上的数。第二小的数已经在第二的位置上了。

  3. 第三轮选择:
    在这里插入图片描述
    假设位置3上的87为剩下数中的最小数,在4-8中寻找比87小的最小的数,记住它的位置。
    在这里插入图片描述
    位置7上的47是4-8中小于87的最小数。
    在这里插入图片描述
    交换位置3和位置7上的数。第三小的数已经在第三的位置上了。

  4. 第四轮选择:
    5.
    假设位置4上的89为剩下数中的最小数,在5-8中寻找比89小的最小的数,记住它的位置。
    在这里插入图片描述
    位置5上的58是5-8中小于89的最小数。
    在这里插入图片描述
    交换位置4和位置5上的数。第四小的数已经在第四的位置上了。

  5. 第五轮选择:
    在这里插入图片描述
    假设位置5上的89为剩下数中的最小数,在6-8中寻找比89小的最小的数,记住它的位置。
    在这里插入图片描述
    位置8上的61是5-8中小于89的最小数。
    在这里插入图片描述
    交换位置5和位置8上的数。第五小的数已经在第五的位置上了。

  6. 第六轮选择:
    在这里插入图片描述
    假设位置6上的68为剩下数中的最小数,在7-8中寻找比68小的最小的数,记住它的位置。
    在这里插入图片描述
    位置7-8没有小于68的数,不进行交换。

  7. 第七轮选择:
    在这里插入图片描述
    假设位置7上的87为剩下数中的最小数,与位置8上的数进行比较。
    假设位置5上的89为剩下数中的最小数,在6-8中寻找比89小的最小的数,记住它的位置。
    位置8上的89大于87,不进行交换。

至此,8个无序的数经过7轮排序成了有序数列,选择相比冒泡就是省略了每次找到小于的数就交换的步骤,变为了找到最小得数直接进行交换,减少了无效的交换次数。

代码实现

//N个数需要N-1轮的排序
for (int i = 0; i < N; i++) {
    //将i的当前位置保存下来放到m中
    int m = i;
    //j从i+1的位置到最后
    for (int j = i + 1; j < N; j++) {
        //凡是当前m位置上的数大于j位置上的数
        if (arr[m] > arr[j]) {
            m = j;//m保存最小数的位置
        }
    }
    //如果m的保存的位置和i的位置不一致了,就说明当前i位置上的值不是最小值,则与m位置上存储的最小值进行交换
    if (m != i) {
        int t = arr[m];
        arr[m] = arr[i];
        arr[i] = t;
    }
}

3、插入排序

4、希尔排序

5、桶排序

6、快速排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值