前言

选择排序是直观的排序,通过确定一个最大或最小值,再从待排序的的数中找出最大或最小的交换到对应位置。再选择次之。双重循环时间复杂度为 O(n^2)。简单选择排序是不稳定排序。

算法性能

时间复杂度: O(n^2),选择排序比冒泡排序快。
稳定性: 不稳定

代码实现

/*选择排序*/
#include <stdio.h>void select_sort(int arr[],int n);  //选择排序函数声明int main()
{int i = 0;int arr[] = {2,4,6,8,0,1,3,5,7,9};int n = sizeof(arr)/sizeof(arr[0]);  //数组元素个数select_sort(arr,n);//打印排好顺序的数组for(i=0;i<n;i++){printf("%d  ",arr[i]);}printf("\n");return 0;
}
//选择排序函数定义
void select_sort(int arr[],int n)
{int i,j,k,tmp;for(i=0;i<n-1;i++)        //n个元素需要排n-1趟{k = i;               //确定一个最小值的下标for(j=i+1;j<n;j++)   //最小的与后面的相比,故j从i+1开始;循环比较到最后一位,故j<n{if(arr[k]>arr[j]) //若当前的最小值大于后面的{k = j;       //重新确定最小值的下标}}if(k != i)            //经过一趟排序,K的值发生变化就交换{tmp = arr[k];arr[k] = arr[i];arr[i] = tmp;}}
}

程序运行结果

答疑解惑

1. 为什么选择排序不稳定呢?
:假设有一个待排序的序列: 2 3 2 1 4
我们知道第一趟排序后就会选择第1个元素2和元素1交换,那么原来序列中两个2的相对顺序就被破坏了,所以选择排序是不稳定的排序算法。

2. 为什么要引入变量k呢?
:变量k的作用是标记最小元素的下标,在出内循环后再交换两个元素的值,这样的好处是一趟排序可能只需要交换一次,运气好的好都不用交换了。这也是为什么选择排序比冒泡排序快。

不稳定的排序-选择排序相关推荐

  1. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  2. 数据结构/排序/选择排序/简单选择排序

    原理 介绍: 原理:每趟排序记录最小记录的索引后交换 类比:猴子搬苞谷,喜欢更大的苞谷.猴子经过1排苞谷,每经过1个苞谷就与心中的苞谷对比,更大就记录当前苞谷的位置,走完这一排苞谷,心中的那个苞谷就是 ...

  3. 算法——排序——选择排序图解动画

    选择排序 简介 代码示例 排序过程 时间复杂度 最差时间复杂度&平均时间复杂度 最优时间复杂度 空间复杂度 稳定性 简介 选择排序(Selection Sort),它的工作原理是:第一次从待排 ...

  4. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

  5. c++ java 选择排序,选择排序(示例代码)

    简述 选择排序的基本思想是:每一趟从待排序列中选取关键字最小的元素,作为有序序列的一个新的元素,直到待排序列只剩下一个元素,则完成排序.主要算法有简单选择排序和堆排序. 简单选择排序 算法思想 假设序 ...

  6. 排序——选择排序(Selection sort)

    算法思想 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾.以此类推,直到全部待排序的数据元素的 ...

  7. C++简单排序——选择排序

    今天我们来学习一种新的排序方法--选择排序. 上一次我们学习了一种简单的排序--冒泡排序.但有的人啊,他就是说:"冒泡排序太难记了!换一种!" 于是,无敌天才 我决定发一下我认为最 ...

  8. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  9. c语言单链表的字母排序,链表排序——选择排序法(纯C语言版)

    /********************************* 链表的排序 *******************************************/ /* =========== ...

最新文章

  1. 解决DexOverflowException: Cannot fit requested classes in the main-dex file
  2. 【剑指offer】21、调整数组顺序使奇数在偶数前面
  3. SAP Marketing Cloud的双重登录认证
  4. 腾讯智慧出行和现代汽车集团创新中心(北京)正式建立创新战略合作伙伴关系
  5. Spring Boot:(二)启动原理解析
  6. php登陆页添加记住密码选项,PHP 实现登录记住密码
  7. 使用CMD实现批量重命名[转]
  8. 公众号获取token失败_恶意请求微信公众号token,导致access_token超过10万次解决思路...
  9. 斗鱼实名认证 mysql_我告诉你斗鱼实名认证怎么取消
  10. 重要发布全总结丨一文看懂阿里云弹性计算年度峰会
  11. 纯css 箭头,纯CSS实现小箭头的案例
  12. 优化无止境,爱奇艺中后台 Web 应用性能优化实践
  13. Linux-各种UID
  14. Android程序员二本出身,阿里架构师经验分享
  15. 搭建Cobbler无人值守安装服务器
  16. 使用OpenWrt创建子网作为二级路由
  17. 著名的菲波拉契(Fibonacci)数列,其第一项为0,第二项为1,从第三项开始,其每一项都是前两项的和。编程求出该数列前N项数据。
  18. java统计图表代码_java swing下用jfreechart开发图表统计情况
  19. 初识数据结构——“数据结构与算法”
  20. TCP吞吐性能优化的吐槽与拯救

热门文章

  1. [Games 101] Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)
  2. linux gtestgmock安装
  3. LiveData vs EventBus?是否可以实现共赢
  4. Java第二次实训课堂
  5. 自学编程系列——4 Numpy数组
  6. GetPixel算法
  7. 7-4 计算职工工资(15分)
  8. R软件-ggplot2 画火山图
  9. sql 纵向求和_SQL语句求和语句该怎么编写?有几种方法?
  10. Linq to sql 求和操作