一、选择排序的介绍

  选择排序(Selection sort)是一种简单直观的排序算法。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

二、选择排序的原理

  1. 未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 再从剩余未排序元素中继续寻找最小(大)元素
  3. 然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

三、选择排序的图解

 

四、选择排序总结

  1. 有N个数据,需要从未排序区挑选N-1次数据放在已排序区队尾
  2. 每次从未排序区中挑选的数据要放在已排序的队尾

五、选择排序的python代码实现

# 定义选择排序函数
def selection_sort(list):
# 计算需要排序的列表元素个数
N = len(list)
# 需要N-1次选择操作
for i in range(N-1):
# 记录最小值的小标
minNum_index = i
# 未排序区域从i+1到末尾N处,属于未排序区,在未排序区在选出最小值处
for j in range(i+1,N):
# 比较大小
if list[minNum_index]>list[j]:
#交换
temp = list[minNum_index]
list[minNum_index] = list[j]
list[j] = temp # 创建一个列表
numList = [19,2,13,8,34,25,7] print("排序前:%s"%numList)
# 调用选择排序
selection_sort(numList)
print("排序后:%s"%numList)

运行结果为:

排序前:[19, 2, 13, 8, 34, 25, 7]
排序后:[2, 7, 8, 13, 19, 25, 34]

六、选择排序的C语言代码实现

版本一

#include <stdio.h>
//定义选择排序函数
void selection_sort(int array[],int arrayLenght)
{
// 需要N-1次选择操作
for (int i=; i<arrayLenght-; i++)
{
// 记录最小值的下标
int minNum_index = i;
// 未排序区域从i+1到末尾N处,属于未排序区,在未排序区再选出最小值处
for (int j = i+; j<arrayLenght; j++)
{
// 比较大小
if (array[minNum_index]>array[j])
{
// 交换
int temp = array[minNum_index];
array[minNum_index] = array[j];
array[j] = temp;
}
}
}
} int main(int argc, const char * argv[]) { // 选择排序函数声明
void selection_sort(int array[],int arrayLenght);
// 创建数组
int numArray[] = {,,,,,,};
// 调用排序
selection_sort(numArray, );
// 验证
for (int i =; i<; i++)
{
printf("%d ",numArray[i]);
} return ;
}

运行结果为:

      

版本二

#include <stdio.h>
//定义选择排序函数
void selection_sort1(int array[],int arrayLenght)
{
// 需要N-1次选择操作
for (int i=; i<arrayLenght-; i++)
{
// 记录最小值的下标
int minNum_index = i;
// 未排序区域从i+1到末尾N处,属于未排序区,在未排序区再选出最小值处
for (int j = i+; j<arrayLenght; j++)
{
// 比较大小
if (array[minNum_index]>array[j])
{
minNum_index = j;
}
}
if (minNum_index != i)
{
int temp = array[i];
array[i] = array[minNum_index];
array[minNum_index] = temp; }
}
} int main(int argc, const char * argv[]) { // 选择排序函数声明
void selection_sort1(int array[],int arrayLenght);
// 创建数组
int numArray[] = {,,,,,,};
// 调用排序
selection_sort1(numArray, );
// 验证
for (int i =; i<; i++)
{
printf("%d ",numArray[i]);
} return ;
}

运行结果为:

      

七、选择排序的时间复杂度

  • 最优时间复杂度:O(n2)
  • 最坏时间复杂度:O(n2)

八、选择排序的稳定性

  选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

python算法与数据结构-选择排序算法(33)的更多相关文章

  1. 冒泡排序算法和简单选择排序算法的js实现

    之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...

  2. python基础:冒泡和选择排序算法实现

    冒泡排序和选择排序   首先引用一下百度百科对于冒泡算法的定义:   冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾 ...

  3. python算法与数据结构-希尔排序算法(35)

    一.希尔排序的介绍 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每 ...

  4. 【排序算法】直接选择排序算法 Java实现

    基本思想 直接选择排序是从无序区选一个最小的元素直接放到有序区的最后. 初始状态:无序区为a[1...n],有序区为空. 第一次排序:在无序区a[1...n]中选出最小的记录a[k],将它与有序区的第 ...

  5. 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...

  6. 算法学习之选择排序算法的python实现

    ——参考自<算法图解> def findSmallest(arr): # 假设第一个元素最小 smallest = arr[0] smallest_index = 0 for i in r ...

  7. 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)

    本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...

  8. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

  9. python选择排序算法总结

    选择排序算法: a=[6,5,4,3,2,1] 算法思路: 第一步:在列表的第一个位置存放此队列的最小值 声明一个变量min_index等于列表的第一个坐标值0 从第一个位置0坐标开始,和它后边所有的 ...

随机推荐

  1. NB-IOT技术学习问题记录

    1. TAU是什么,跟踪区更新 2. 小区和基站的区别 3. 附着和设备注册的关系? 4. 不携带PDN是什么意思? 5. PLMN 公共陆地移动网络,和小区的关系,区别?

  2. soapUI使用-调用post方法

    前言 soapUI的安装请查看此链接:https://www.cnblogs.com/linxiu-0925/p/10138771.html 使用步骤 1打开soapUI 2新建一个项目:New SO ...

  3. windows中怎么添加定时任务

    linux中有crontab定时任务,很方便 其实windows也有类似的 需求:定时执行python脚本 1.Windows键+R,调出此窗口,输入compmgmt.msc 2. 每分钟都执行一次脚 ...

  4. Module 'mysql' already loaded in Unknown on line 0解决方法

    Module 'mysql' already loaded in Unknown on line 0解决方法 直接进入php.ini 把;extension=mysql.so注释掉就好了

  5. mysql慢查询日记

    mysql慢查询日记 <pre>#必须写到mysqld 注意给/tmp/showslowmysql.log 775权限 要写入权限[mysqld]#开启慢查询日记slow_query_lo ...

  6. mysql left join和union结合的用法

    left join和union结合的用法子查询union 然后加个括号设置个别名 (union自动去除 重复的 ) <pre>select o.nickName,o.sex,o.provi ...

  7. LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)

    669. 修剪二叉搜索树 669. Trim a Binary Search Tree 题目描述 LeetCode LeetCode669. Trim a Binary Search Tree简单 J ...

  8. [基础]C++:名字的作用域

    每个名字都有自己的活动空间,同一个名字在不同的作用域可能指向不同的实体. 作用域:通常是以{}为分隔. 名字的有效区域开始于名字的声明,以声明语句所在的末端为结束. #include<iostr ...

  9. 【转】用chrome滚动截屏

    用开发者常用的网站chrome,打开需要截屏的网页 使用快捷键组合:Alt + Command + I (Mac) || Ctrl + Shift + I (Windows) 使用快捷键组合来打开命令 ...

  10. git clone一个仓库下的单个文件【记录】

    注意:本方法会下载整个项目,但是,最后出现在本地项目文件下里只有需要的那个文件夹存在.类似先下载,再过滤. 有时候因为需要我们只想gitclone 下仓库的单个或多个文件夹,而不是全部的仓库内容,这样 ...