手撕排序算法系列之第四篇:选择排序。

从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等。

大家可以点击此链接阅读其他排序算法:排序算法_大合集(data-structure_Sort)

本篇主要来手撕选择排序~~

目录

1.常见的排序算法

1.1选择排序

2.直接选择排序

2.1基本思想(一次选一个数)

2.1.1选择排序动态视频  *(看视频更好理解)

2.2基本思想(一次选两个数)

3.选择排序的实现

3.1选择排序实现代码

4.选择排序测试

5.选择排序时间复杂度

6.选择排序的特性总结

1.常见的排序算法

1.1选择排序

选择排序的基本思想:

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

2.直接选择排序

2.1基本思想(一次选一个数)

1、我们遍历一遍数组选出一个最小的数字。

2、让第一个数字和这个数字交换(默认升序排序),此时最小的数字就来到了第一个位置。

3、重复1操作选出第二小的数字,让第二个数字和这个次小的数字交换,此时最小的数字就来到了第二个位置.....循环选择排序,直至排序完成。

分析图解:

2.1.1选择排序动态视频  *(看视频更好理解)

选择排序

2.2基本思想(一次选两个数)

这个方法每次只选择一个数字,显然有点大材小用。因为既然每次要选择数字,我们不妨每次选择2个数字。具体步骤如下:

1、我们遍历一遍数组选出一个最小的数字和一个最大的数字。

2、选择完成后让最小的数字放到第一个位置,最大的数字放到最后的位置。

3、当左边left大于等于右边right时说明排序完成

3.选择排序的实现

为了提高选择的效率,我们这里所选择的是每次选两个数,一个最大数一个最小数。这里我们需要有一个非常非常重要的细节需要把控。

如果有这么一种特殊的情况,在原数组中第一个位置的数字是整个数组最大的数字,那么按照我们之前的逻辑挪动还能得到我们想要的结果吗?结果是不能,具体分析看下图过程解析。

因此为了避免此类问题造成结果出错,我们需要在程序中加一个修正,修正的逻辑如下:

如果最左边的left位置和max重叠,我们让min位置的值赋值给max位置,因为在第一次最小数字和left交换的时候,最大的数字被交换到了min位置。画图逻辑如下

3.1选择排序实现代码

//选择排序
void SelectSort(int* a, int n)
{int left = 0, right = n - 1;while (left < right){int mini = left, maxi = left;for (int i = left + 1; i <= right; ++i){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[left], &a[mini]);//如果left和maxi重叠,修正一下maxi即可if (left == maxi)maxi = mini;Swap(&a[right], &a[maxi]);left++;right--;}
}

4.选择排序测试

//选择排序
void SelectSort(int* a, int n)
{int left = 0, right = n - 1;while (left < right){int mini = left, maxi = left;for (int i = left + 1; i <= right; ++i){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[left], &a[mini]);//如果left和maxi重叠,修正一下maxi即可if (left == maxi)maxi = mini;Swap(&a[right], &a[maxi]);left++;right--;}
}
//打印数组
void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}//选择排序
void TestSelectSort()
{int a[] = { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };SelectSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}int main()
{//选择排序TestSelectSort();return 0;
}

测试结果:

5.选择排序时间复杂度

选择排序的时间复杂度是O(n^2)。

无论是顺序还是逆序,选择排序的时间复杂度都是O(n^2),这是因为在每遍筛选数组时,都要遍历数组选出最大和最小的数组,每一次遍历即是O(n)。即使是自身有序的数组,但是计算机是不知道的,还是要遍历一遍选出最小和最大的。因此综上所述选择排序的时间复杂度是O(n^2)。

6.选择排序的特性总结

直接选择排序的特性总结:
1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

(本篇完)

[ 数据结构 -- 手撕排序算法第四篇 ] 选择排序相关推荐

  1. 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)

    上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...

  2. 【排序算法】图解简单选择排序(图解堪比Debug显示每次循环结果)

    [排序算法]图解简单选择排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍简单选择排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...

  3. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序

    [简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...

  4. C语言排序算法(一)——选择排序实现

    C语言排序算法(一)--选择排序实现 编写程序,实现从键盘输入10个数,并用选择法从小到大排序. 简单选择排序的基本思想:第1趟,在待排序记录r[1]r[n]中选出最小的记录,将它与r[1]交换:第2 ...

  5. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  6. Python排序算法(一)冒泡排序、选择排序、插入排序

    今天总结一下Python中的排序算法.这篇文章有的排序算法是:冒泡排序.选择排序.插入排序. 冒泡排序 先看一下代码. ''' 冒泡排序 '''def bubble_sort(aList):n = l ...

  7. 排序算法第四篇——冒泡排序

    算法描述: 依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个 ...

  8. 关于算法--蛮力法篇--选择排序

    近日开始学习算法,所看课本为清华大学出版社的<算法设计与分析基础>,对简单的数据结构进行了复习,已经学习了算法效率分析基础. 本篇开始对所学算法的思想进行实际JS编码,看学习的进度,每日写 ...

  9. C语言实例——四种排序算法(冒泡排序、选择排序、插入排序、快速排序)

    C 语言排序算法 BB Time 一.冒泡排序 1.原理 2.代码 二.选择排序 1.原理 2.代码 三.插入排序 1.原理 2.代码 四.快速排序 1.原理 2.代码 3.操作过程 BB Again ...

最新文章

  1. 【大数据技术干货】阿里云伏羲(fuxi)调度器FuxiMaster功能简介(一) 多租户(QuotaGroup)管理...
  2. Docker(六):Docker 仓库管理与镜像加速
  3. mysql保持开启事件调度器_MySQL 5.1.6开始的事件调度器
  4. 我们边吃曲奇边聊——Cookie与Session那些事
  5. Spring Boot-springbootHelloword(一)
  6. 如何使用和自定义Win11快速设置菜单
  7. Java继承_30道最常问的Java基础面试题
  8. 一台服务器装两个sql server_搭建我的世界基岩版服务器
  9. 【大数据部落】(数据挖掘)如何用大数据做用户异常行为分析
  10. python地震数据处理_Python爬虫之实时地震数据
  11. Office小知识(五)——Word中删除分节符而不影响前节页面设置
  12. 高琪老师(零基础初学入门)J20飞机项目飞机爆炸轮播图片
  13. QA | R做生存分析如何取最佳cutoff(截断)
  14. zabbix3.0 之短信报警配置
  15. python分析出nba球员的位置_虎扑热帖|Python数据分析|NBA的球星们喜欢在哪个位置出手...
  16. 给你一台大疆无人机,你能用来做点啥?(三)------倾斜摄影建模基础
  17. (转)Excel自定义格式详解
  18. 视频侦查实战应用平台
  19. 理想低通滤波器(频率域滤波)
  20. 2021年MathorCup高校数学建模挑战赛——大数据竞赛A题

热门文章

  1. 投资理财-简单策略其实不简单
  2. C++图像处理 -- 图像色阶调整
  3. 2020.9.28--PS--色阶、色阶上色、曲线
  4. @程序员,不加班就滚吧 | 程序员有话说
  5. android视频开发面试!金三银四我带你去BAT面试现场,附带学习经验
  6. GPU异构计算基础知识
  7. 【hadoop】MultipleOutputFormat和MultipleOutputs
  8. 《马向阳下乡记》看完了,你对谁的印象最深
  9. web前端学习(六):WebRTC实时通信,掌握WebSocket很实用
  10. 2018.8.25T2(随机化)