参考链接: Python中选择排序Selection Sort

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序示例

初始值: 3 1 5 7 2 4 9 6

第一趟: 1 3 5 7 2 4 9 6

第二趟: 1 2 5 7 3 4 9 6

第三趟: 1 2 3 7 5 4 9 6

第四趟: 1 2 3 4 5 7 9 6

第五趟: 1 2 3 4 5 7 9 6

第六趟: 1 2 3 4 5 6 9 7

第七趟: 1 2 3 4 5 6 7 9

第八趟: 1 2 3 4 5 6 7 9

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

......

第 i 趟,则从第 i 个记录开始的 n-i+1 个记录中选出关键码最小的记录与第 i 个记录交换,直到整个序列按关键码有序。

算法的实现:

// 输出数组内容

void print(int array[], int length, int i) {

printf("i=%d:",i);

for (int j = 0; j < length; j++) {

printf(" %d ", array[j]);

}

printf("\n");

}

// 获取数组最小值下标

int SelectMinKey(int array[], int length, int i) {

int k = i;

for (int j = i + 1; j < length; j ++) {

if (array[k] > array[j]) {

k = j;

}

}

return k;

}

// 简单选择排序(Simple Selection Sort)

void SelectSort(int array[], int length) {

int key, temp;

for (int i = 0; i < length; i ++) {

key = SelectMinKey(array, length, i); // 获取最小元素的下标

if (key != i) { // 最小元素与第i位置元素交换

temp = array[i];

array[i] = array[key];

array[key] = temp;

}

print(array, length, i);

}

}

int main(int argc, const char * argv[]) {

int arraySelectSort[8] = { 3, 1, 5, 7, 2, 4, 9, 6 };

SelectSort(arraySelectSort, 8);

printf("\n");

return 0;

}

算法的改进(二元选择排序)

简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:

// 二元选择排序

void SelectSort2(int array[], int length) {

int i, j, min, max;

for (i = 0; i < length / 2; i ++) { // i 跑 n / 2 趟排序就会排序完成

min = max = i; // 先将 min 和 max 都指向待排序的第一个元素

for(j = i; j < length - i; j ++) {

if (array[j] < array[min]) {

min = j;

continue;

}

if (array[j] > array[max]) {

max = j;

}

}

// 将最小值放在第i处,将最大值放在第length-i-1处

// 注意:这里不能把 array[max]、array[min] 直接和 array[i] 和 array[length-i-1]调换

int maxtemp = array[max];

int mintemp = array[min];

array[max] = array[length-i-1];

array[min] = array[i];

array[i] = mintemp;

array[length-i-1] = maxtemp;

print(array, 8, i);

}

}

总结

在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。

最坏情况下,即待排序记录初始状态是按第一条记录最大,之后的记录从小到大顺序排列,则需要移动记录的次数最多为3(n-1)。简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n^2),进行移动操作的时间复杂度为O(n)。

简单选择排序是不稳定排序。

[转载] python选择排序二元选择_选择排序:简单选择排序(Simple Selection Sort)相关推荐

  1. c语言用sort函数选择排序,简单选择排序(Simple Selection Sort)的C语言实现

    简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章, ...

  2. 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)

    本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...

  3. 选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  4. 简单选择排序(Simple Selection Sort)

    介绍: 简单选择排序的工作方式突出"选择"二字,每次从待排序数据中选择符合条件的元素放在已排序元素末尾.对于少量元素的排序,简单选择排序是一个有效的算法. 思想: 第一次从待排序的 ...

  5. 七种排序------简单选择排序(Simple Selection Sort)

    简单选择排序法就是通过 n - i 次关键字间的比较,从 n - i + 1个记录中选出关键字最小的记录,并和第 i 个记录交换. 代码如下: void SelectSort(SqList *L) { ...

  6. python实现五大基本算法_算法基础:五大排序算法Python实战教程

    排序是每个算法工程师和开发者都需要一些知识的技能. 不仅要通过编码实现,还要对编程本身有一般性的了解. 不同的排序算法是算法设计如何在程序复杂性,速度和效率方面具有如此强大影响的完美展示. 让我们来看 ...

  7. python五种常见的排序方法是_常见的经典的排序方法的实现(Python)

    常见的经典算法的实现 首先来一张图,这张图总结了常见的几种排序算法的时间复杂度和空间复杂度的对比.现对常见的几种算法进行实现,以备后需.图片来源:专知 1. 快速排序 思路 先寻找一个基准数,然后接下 ...

  8. mysql有选择地输出数据_有条件地选择MYSQL列

    我的问题的示例模式在 SQLFiddle给出,如下所示: CREATE TABLE `players` ( `player1id` int(11) NOT NULL, `player2id` int( ...

  9. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

最新文章

  1. python下载代码-Python3----下载小说代码
  2. Python基础训练题-简单数学公式
  3. 如何使用ADLab搭建活动目录实验环境来练习渗透测试技术
  4. C++ Primer这本书怎么样?
  5. YUV测试序列下载地址
  6. 大橙子_【大橙子活动】工程学院新媒体中心第二届总结大会圆满结束!
  7. ext的treepanel的item判断是否为leaf
  8. PYthon常用模块 logging 日志
  9. 使用超时加锁:pthread_mutex_timedlock
  10. 佳能g2810提示5b00_佳能G2810打印机清零软件5B00 5b01废墨清零1700代码
  11. 银河麒麟v10sp1桌面安装远程控制工具todesk
  12. 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心
  13. 计算某年某月某日到某年某月某日之间的天数
  14. 电脑局域网所有IP及对应MAC地址查询
  15. easyui mysql_Easyui 添加查询功能_EasyUI 教程
  16. 《STL源码剖析》-- stl_uninitialized.h
  17. MySQL-限制结果-LIMIT(limit)
  18. libjpeg解码 jpeg文件
  19. 2022-2028全球与中国绿色氢基微电网市场现状及未来发展趋势
  20. OSChina 元宵节乱弹 ——青龙偃月刀都实名了

热门文章

  1. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列
  2. 2021牛客暑期多校训练营7,签到题FHI
  3. 【NOI OpenJudge】【1.1】编程基础之输入输出
  4. 【codevs1282】约瑟夫问题
  5. php中usc2编码,规则编码说明
  6. 第一章节 c#面向对象
  7. SQL Sever 聚合函数
  8. Python入门--集合的创建,set(),{}
  9. SPOJ D-query 树状数组离线 求区间内不同数字的个数
  10. jquery的Dom操作查找节点