选择排序 ( 直接选择排序 && 堆排序 )

选择排序 ( 直接选择排序 && 堆排序 )1 直接选择排序 核心思想 每一次从待排序的数据元素中选出最小 或最大 的一个元素 存放在序列的起始位置 直到全部待排序的数据元素排完 过程 1 在元素集合 array i array n 1 中选择关键码最大 小 的数据元素 2 若它不是这组元素中的最后一个 第一个 元素 则将它与这组元素中的最后一个 第一个 元素交换 3 在剩余的 array i array n 2 array i 1 array n 1 集合中

1、直接选择排序

? 核心思想 ?

  每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

❗ 过程:❕

  1️⃣ 在元素集合 array[i] – array[n-1] 中选择关键码最大 (小) 的数据元素

  2️⃣ 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换

  3️⃣ 在剩余的 array[i] – array[n-2] (array[i+1]–array[n-1]) 集合中,重复上述步骤,直到集合剩余 1 个元素

❗ 直接选择排序的特性总结:❕

  1️⃣ 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

  2️⃣ 时间复杂度:O(N^2) – 最好 / 最坏

  3️⃣ 空间复杂度:O(1)

  4️⃣ 稳定性:不稳定

❗ 动图演示:❕

请添加图片描述
? 实现代码 :

void Swap(int* px, int* py) { 
    int temp = *px; *px = *py; *py = temp; } void SelectSort(int* a, int n) { 
    int i = 0; int begin = 0; while (begin < n) { 
    int mini = begin; //选最小 for (i = begin; i < n; i++) { 
    if (a[i] < a[mini]) { 
    mini = i; } } //交换 Swap(&a[begin], &a[mini]); //迭代 begin++; } } 

? 实现 SelectSort 的优化代码 :

   遍厉一遍选出最小的和最大的,然后把最小的放在左边,最大的放在右边

void Swap(int* px, int* py) { 
    int temp = *px; *px = *py; *py = temp; } void SelectSortPro(int* a, int n) { 
    int i = 0; int begin = 0, end = n - 1; while (begin < end) { 
    //选最大和最小 int mini = begin, maxi = begin; for (i = begin; i <= end; i++) { 
    if (a[i] > a[maxi]) { 
    maxi = i; } if (a[i] < a[mini]) { 
    mini = i; } } //交换 Swap(&a[begin], &a[mini]); //当a数组里第1个元素是最大值时,此时经过上面的Swap,最大值的位置已经更改了,所以需要修正最大值的位置,让下一个Swap正确交换 if (begin == maxi) { 
    maxi = mini; } Swap(&a[end], &a[maxi]); //迭代 ++begin; --end; } } 
2、堆排序

? 核心思想 ?

❗ 堆排序的特性总结:❕

  1️⃣ 堆排序使用堆来选数,效率就高了很多。

  2️⃣ 时间复杂度:O(N*logN)

  3️⃣ 空间复杂度:O(1)

  4️⃣ 稳定性:不稳定

❗ 动图演示:❕

请添加图片描述
请添加图片描述
? 实现代码 :




void Swap(int* px, int* py) { 
    int temp = *px; *px = *py; *py = temp; } void AdjustDown(int* a, int n, int parent) { 
    int child = parent * 2 + 1; while (child < n) { 
    if (a[child] < a[child + 1] && child + 1 < n) { 
    child++; } if (a[child] > a[parent]) { 
    Swap(&a[child], &a[parent]); parent = child; child = parent * 2 + 1; } else { 
    break; } } } void HeapSort(int* a, int n) { 
    //建大堆 int i = 0; for (i = (n - 1 - 1) / 2; i >= 0; i--) { 
    AdjustDown(a, n, i); } int end = n - 1; //交换并调整 while (end > 0) { 
    Swap(&a[0], &a[end]); AdjustDown(a, end, 0); end--; } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222574.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:28
下一篇 2026年3月17日 下午3:29


相关推荐

  • JsonArray转List<String>「建议收藏」

    JsonArray转List<String>「建议收藏」JsonArray转ListStringnewIds=JSONObject.getJSONArray(“newIds”).toString();List<String>list=JSONObject.parseArray(newIds,String.class);

    2022年6月23日
    176
  • 图书管理系统的系统设计(图书管理系统任务书)

    图书管理系统设计与实现图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐,需要大量的人力、物理、财力,极大的浪费了资源,对于图书管理人员来说,图书馆管理包括图书信息管理、图书类别管理、借阅信息管理、管理员信息管理等等。而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出错,给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件。让管理员方便的管理图书及用户信息,方便用户查找图书。1、本课程设计的目的(1)掌握企业级应用系统的基本

    2022年4月16日
    36
  • 数学建模-神经网络模型

    数学建模-神经网络模型神经网络简介人工神经网络是在现代神经科学的基础上提出和发展起来的 旨在反映人脑结构及功能的一种抽象数学模型 自 1943 年美国心理学家 W McCulloch 和数学家 W Pitts 提出形式神经元的抽象数学模型 MP 模型以来 人工神经网络理论技术经过了 50 多年曲折的发展 特别是 20 世纪 80 年代 人工神经网络的研究取得了重大进展 有关的理论和方法已经发展成一门界于物理学 数学 计算机

    2026年3月19日
    1
  • python 装饰器

    python 装饰器本文首先介绍了什么是闭包函数,然后从闭包函数引入到了函数装饰器、类装饰器,之后又说明了如果一个函数被多个装饰器同时修饰时它们的执行顺序是什么样的,最后介绍了避免装饰后原函数信息丢失的解决方案。

    2022年7月5日
    27
  • 科大讯飞旗下App完成鸿蒙化升级

    科大讯飞旗下App完成鸿蒙化升级

    2026年3月14日
    1
  • 弹出USB大容量存储设备时出问题_win10无usb大容量存储

    弹出USB大容量存储设备时出问题_win10无usb大容量存储1、打开计算机管理2、点击事件查看器->自定义视图->管理事件3、双击管理事件里面的警告事件,打开它,4、点击详细信息5、记住上面的进程ID,然后打开任务管理器,找到刚才的那个进程,鼠标右键后点击结束进程树。…

    2022年10月7日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号