选择排序

Posted xigaun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择排序相关的知识,希望对你有一定的参考价值。

欢迎关注fish的公众号:fish码农成长之旅

相信大家对扑克牌并不陌生,当我们在齐牌的时候是不是会按照大小顺序进行排列,选择排序的过程就跟扑克牌差不多一样的直观简单。其排序时间复杂度总是O(n^2)的。

算法步骤

把整个数组分为已经排序的部分和未排序的部分,初始已经排序的部分为0,未排序的部分为n(数组大小)

首先根据自己的需求在未排序数组中找到最小(大)的数放在已排序数组末端,已经排序好的大小加一,未排序数组大小减一,然后重复此步骤继续在未排序的数组中找最小(大)的数放在已排序的末端。

实例演示

总共6个数的排序,按照从小到大排序,原始数据为:3 38 5 1 9 4

可以看出,每一次排序一个数就是遍历出最小(大)的位置,然后跟已经排序好数组的末端那个数交换位置,当遍历n次之后整个数组排序完毕。

代码实现

template <class T>
void selection_sort(std::vector<T> &arrs) 
  int n = arrs.size();  // 数组的大小
  if (n <= 1)          // 一个数的情况不需要排序
    return;
  

  for (int idx_i = 0; idx_i < n - 1;
       ++idx_i)   // 为什么 n - 1:最后只剩一个数,就不需要再比较了
    int target_idx = idx_i;
    for (int idx_j = idx_i + 1; idx_j < n; ++idx_j) 
      // 三目运算, 取最小值的下标赋值给 target_idx
      target_idx = arrs[idx_j] < arrs[target_idx] ? idx_j : target_idx;
    

    std::swap(arrs[idx_i], arrs[target_idx]);  // 交换两个位置的数
  

以上是关于选择排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

❤️数据结构入门❤️(4 - 2)- 选择排序

选择排序之二:简单选择排序

排序算法6--选择排序--简单选择排序

Python | 选择排序之树形选择排序

第二篇,选择排序算法:简单选择排序堆排序