当前位置: 首页 > news >正文

排序-----选择排序

首先介绍几种排序的分类:

        选择排序是每次都遍历,标记出最小的元素,然后把它放在前面。

        本文介绍优化后的版本:每次遍历标记出最小的和最大的元素,分别放到前面和后面。(注意这里是找到对应的下标,然后将对应下标的数据进行交换)

        注意最后不要忘了begin++和end--。

void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; ++i){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}Swap(&a[begin], &a[mini]);Swap(&a[end], &a[maxi]);++begin;--end;}
}

但是!这段代码是有问题的!

第一行为原始数据,第二行为排序后的数据:

这显然是不对的!那么问题出现在哪呢?

这个地方第一次交换就出现问题了,因为maxi和begin重叠,导致最大值并没有移动到最后。

所以要加上一个判断条件:

void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; ++i){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}Swap(&a[begin], &a[mini]);if (begin == maxi)maxi = mini;Swap(&a[end], &a[maxi]);++begin;--end;}
}

这个排序最好情况和最坏情况都是O(N^2)。


http://www.mrgr.cn/news/31344.html

相关文章:

  • 机器人上的DPDK使用思考
  • 对商品分类系统的若干问题的思考
  • Go语言基础学习01
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
  • C#开发记录如何建立虚拟串口,进行串口通信,以及通信模板
  • DOS(Disk Operating System,磁盘操作系统)常用指令
  • Java知识点小结3:内存回收
  • C++自动寻径算法
  • 网关登录校验(2)----网关如何将用户信息传递给微服务
  • Django+React+Neo4j实现的地质领域知识图谱系统
  • DNS解析流程
  • pandas入门
  • day51
  • df将字典转换为df,如何以key为行而不是列
  • 【刷题日记】15. 三数之和
  • 有关JS下隐藏的敏感信息
  • 算法【Dijkstra算法及分层图最短路】
  • C++——用选择法对10个数值进行排序。
  • [嵌入式] 3588相关
  • 码头童话,“丈量”行业数智化转型