博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
八大排序算法之选择排序
阅读量:4185 次
发布时间:2019-05-26

本文共 1929 字,大约阅读时间需要 6 分钟。

上一篇博客我们学习了插入排序之直接插入排序和希尔排序,。

这篇文章我们来学习选择排序。
常见的选择排序有直接选择排序和堆排序。选择排序的基本思想就是从每一趟(比如第i趟)从其之后的n-i个待排序数据中找到关键码最小的数据,作为有序数据的第i个元素。当n-2趟排完之后,只剩下一个待排序数据,就不用进行选择了。

1.直接选择排序

基本思想:比较+交换

1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3)重复第二步,直到所有元素均排序完毕。

时间复杂度:O(N^2)

空间复杂度:O(1)

这里写图片描述
动图展示如上。下面给出一个示例。原数组是{5,7,6,8,4,2,9,3,0,1},第一次选择排序后{0,7,6,8,4,2,1,3,5,9},先在数组中找到最大和最小的,然后进行交换,left和right向中间移动。
这里写图片描述
因为在交换的时候可能让两个相等的数发生位置变化,所以选择排序是不稳定的。

void  SelectSort(int a[],size_t n){    int left = 0;    int right = n - 1;    while (left < right)    {        int MinIndex = left;        int MaxIndex = right;        for (int i = left; i <= right; i++)        {            if (a[i] < a[left])                MinIndex = i;            if (a[i]>a[right])                MaxIndex = i;        }        swap(a[left], a[MinIndex]);        if (MaxIndex == left)            MaxIndex = MinIndex;        swap(a[MaxIndex], a[right]);        ++left;        --right;    }}
2.堆排序

我们常说的堆排序也是选择排序的一种,它是一种树形的排序方式,是对简单选择排序的一种改进。

基本思想:本质是一种数组对象。特别重要的一点性质:任意的叶子节点小于(或大于)它所有的父节点。对此,又分为大顶堆和小顶堆,大顶堆要求节点的元素都要大于其孩子,小顶堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求。

即对一个数组进行堆化,找出最大的数(默认升序),和尾部的数进行交换,重建堆……

重点:必须清楚是大堆还是小堆,数组堆化的时候从哪一个结点开始,重新调整堆时是从堆头开始调整。

时间复杂度: 每次调整堆都是log(N),N个数就是N*log(N)

这里写图片描述

我们可以知道,在堆排序时,每次将最后一个数与第一个数进行交换,所以堆排序是不稳定的。

void AdjustDown(int a[],int n,int root){    int child = 2 * root + 1;    while (child < n)    {        if (child + 1 < n && a[child] < a[child + 1])            ++child;        if (a[child]>a[root])        {            swap(a[child],a[root]);            root = child;            child = 2 * root + 1;        }        else              break;    }}void HeapSort(int a[],size_t n){    //调整成一个堆    for (int i = (n - 2) / 2; i >= 0; i--)    {        AdjustDown(a, n,i);    }    int end = n - 1;    while (end > 0)    {        swap(a[end], a[0]);        AdjustDown(a, end, 0);        end--;    }}

选择排序的基本思想都是一样的,先找到符合要求的数,再进行交换,直至完成整个数组排序,因此,选择排序都是不稳定的。

你可能感兴趣的文章
在macOS 10.13.6下安装Grafana实录
查看>>
使用Go语言遇到的“坑”收集
查看>>
在Mac上设置环境变量并永久生效的方法
查看>>
使用govendor灵活管理Go程序中的依赖包
查看>>
安装vim-go插件之后遇到的gopls警告信息不消失的问题的解决方法
查看>>
在CentOS 7.7 x86_64上安装python3.7.7
查看>>
在CentOS 7.7 x86_64上安装python3的selenium 3模块实录
查看>>
在CentOS 7.7 x86_64上安装InfluxDB 1.8.0实录
查看>>
CentOS 7.5 如何升级Git实录
查看>>
Python中的urllib.quote和Go中的url.QueryEscape关系探讨
查看>>
在Mac上使用pip3安装python的数据统计模块实录
查看>>
在Mac上使用pip3安装交互式环境IPython实录
查看>>
在Mac上使用pip3安装Jupyter Notebook并简单使用
查看>>
在Mac上利用pip3安装pyecharts模块
查看>>
go连接Kafka报错kafka: client has run out of available brokers to talk to
查看>>
在CentOS 7.5上升级SQLite3过程实录
查看>>
Mastering Algorithms with C中文版附带源码说明
查看>>
[综合面试] 计算机面试书籍与求职网站推荐
查看>>
删除链表中的重复项
查看>>
交互两个数(不引入第三个变量)
查看>>