一、选择排序的介绍

  选择排序(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. C1128节数超过对象文件格式限制: 请使用 /bigobj 进行编译

    今天debug C++项目是遇到 解决方案: 右键项目—>属性 输入 /bigobj 再次编译问题解决

  2. win7/win10 设置始终以管理员身份运行cmd窗口

    在桌面上找到cmd快捷方式图标,右键"属性" 4.选择"快捷方式",点击“高级” 5.勾选用管理员身份运行,点击"确定" 6.点击" ...

  3. C#基于RabbitMQ实现客户端之间消息通讯实战演练

    一.背景介绍和描述 MQ消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.何时需要消息队列?当你需要使用 ...

  4. Redis专栏

    后端开发都应该掌握的Redis基础 Redis实用监控工具一览

  5. TCP协议有几大计时器?

    1)超时重传计时器 目的:避免无限等待确认报文 创建时间:在发送TCP报文段时,会为该报文段设置一个超时重传计时器 可能发生的情况:在超时时间到达之前,收到了该报文段的确认则撤销计时器,否则重传该报文 ...

  6. 40 多线程(十二)——ReentrantLock 可重入锁

    我们使用的synchronized加的锁是可以延续使用的,如下: public void test() { //第一次获得锁 synchronized(this) { while(true) { // ...

  7. CI中如何配置BootStrap

  8. CORS讲解

    跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源.当一个资源从与该资 ...

  9. element-ui 默认排序

    table属性中,设置 :default-sort="{prop:'time', order:'descending'}" 1. prop为排序列,order为排列顺序 2. 多级 ...

  10. Bootstrap框架 简单使用

    目录 Bootstrap框架 简单使用 什么是Bootstrap 下载 Bootstrap 项目结构 Bootstrap 简单使用 表格格式 Bootstrap 按钮颜色 尺寸 Bootstrap框架 ...