> 文章列表 > 【数据结构】-选择排序(选择排序,堆排序)

【数据结构】-选择排序(选择排序,堆排序)

【数据结构】-选择排序(选择排序,堆排序)

🎇作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
💥作者gitee:link
【数据结构】-选择排序(选择排序,堆排序)
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

选择排序

  • 前言
  • 一、选择排序
  • 二、[堆排序](https://editor.csdn.net/md/?articleId=129768293)
  • 三、总结

前言

上一篇我讲过插入排序,这篇我们开始介绍选择排序,这个家族的排序也有两种,一个是选择排序,一个是堆排序,我们就着重来介绍这两个为什么叫选择排序(以升序进行讲解)


一、选择排序

选择排序,顾名思义就是选择数进行排序,我们可以选择一个数(最大或者最小)也可以选择两个数(最小和最大),我们先来介绍选择两个数的选择排序,
我们通过循环来选择最大和最小的数,把它们分别放到最左边再放到左右边,然后把最左边和最右边去掉再选择最小和最大的数
我们先来看单趟排序的思路图:

【数据结构】-选择排序(选择排序,堆排序)
我们看看单趟排序的代码:

    int mini = 0;int maxi = 0;for (int i = 0; i <= n-1; i++){if (a[i] < a[mini]){mini = i;//找最小下标}if (a[i] > a[maxi]){maxi = i;//找最大下标}}swap(&a[0], &a[mini]);//把最小的值交换到最左边if (maxi == 0)//防止最大值就是左边,被最小值交换后,最大值就跑到最小下标的位置了{maxi = mini;}swap(&a[n-1], &a[maxi]);

看看运行结果:
【数据结构】-选择排序(选择排序,堆排序)
我们给左右再单纯定义一个下标,这样不久可以来控制遍历的范围了吗??++乐翻天,–right
我们来看完整选择排序:

void selectsort(int* a, int n)
{int left = 0;int right = n - 1;int mini = left;int maxi = left;while (left < right){for (int i = left; i <= right; i++){if (a[i] < a[mini]){mini = i;}if (a[i] >= a[maxi]){maxi = i;}}swap(&a[left], &a[mini]);if (maxi == left){maxi = mini;}swap(&a[right], &a[maxi]);++left; --right;}
}

相信大家看到这里应该知道选择排序是怎么进行排序了吧,注意第二次交换之前要进行一个判断就行了

接下来简单介绍选择一个数来进行选择排序是怎么排序的吧
想法和上面一样,选择一个最大或者最小的数,放到最右边或者最左边,然后去掉排好的位置继续来选择,我们就之际来看代码,上面弄懂了,这个非常的简单:

void selectsort(int* a, int n)
{int left = 0;int mini = left;while (left < n){for (int i = left; i <n; i++){if (a[i] < a[mini]){mini = i;}}swap(&a[left], &a[mini]);++left;}
}

我就不做过多的分析了,接下来讲堆排序

二、堆排序

堆排序再之前的博客就已经讲到过了,今天就不做过多的介绍,来简单说说为什么堆排序为什么是选择排序家族的,我们要先了解堆排序的排序原理,我们要先了解大根堆和小根堆,这两个堆的特点都是堆顶不是全部元素最小就是最大的,我们先要建堆,这样我们就能选择出来了最大或者最小的元素,然后把这个数去掉再选择第二小的或者大的数调整堆,变成大根堆或者小根堆,最后拍好序,整体大思想和选择排序是一样的,前面有些名词不懂的可以点开上面两篇博客链接自己去学习一下

三、总结

我们又介绍选择排序,两种排序的整体思想又相似之处,单处理起来截然不同,堆排序比选择排序好很多,后面的博客会给大家测试性能,并且介绍一下为什么堆排序好,这就要从时间复杂度来说,还请大家可以多多来支持一下,今天的知识就先分享到这里了,我们下篇再见。
【数据结构】-选择排序(选择排序,堆排序)