简单选择排序(Simple Selection Sort)

一、算法基本思想:

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

简单选择排序可以说是冒泡排序的一种改版,它不再两两比较出较小数就进行交换,而是每次遍历比较当前数的后面的所有数,最后再把最小的数和当前数进行交换。

二、排序原理如下:

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

演示图例1:

演示图例2:

三、代码实现:

C语言代码(1):

void selectSort(int arr[], int len)
{int i, j;int min; //待排序数组中最小值的下标int tmp;for (i = 0; i < len - 1; ++i)//i = 0,第一次待排数组为所有数{   min = i;for (j = i + 1; j < len; ++j){if (arr[j] < arr[min]){min = j;//}}//将arr[i]与arr[min]交换位置tmp = arr[i];arr[i] = arr[min];arr[min] = tmp;}
}
void selectShow(int arr[], int len)
{for (int i = 0; i < len; ++i){printf("%d ", arr[i]);}printf("\n");
}
int main()
{int arr[] = {59,26,245,21,6,10,16};int len = sizeof(arr) / sizeof(arr[0]);selectShow(arr, len);selectSort(arr, len);selectShow(arr, len);return 0;
}

C语言代码(2):

void print(int a[], int n ,int i){  cout<<"第"<<i+1 <<"趟 : ";  for(int j= 0; j<8; j++){  cout<<a[j] <<"  ";  }  cout<<endl;
}
/** * 数组的最小值 * * @return int 数组的键值 */
int SelectMinKey(int a[], int n, int i)
{  int k = i;  for(int j=i+1 ;j< n; ++j) {  if(a[k] > a[j]) k = j;  }  return k;
}  /** * 选择排序 * */
void selectSort(int a[], int n){  int key, tmp;  for(int i = 0; i< n; ++i) {  key = SelectMinKey(a, n,i);           //选择最小的元素  if(key != i){  tmp = a[i];  a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换  }  print(a,  n , i);  }
}
int main(){  int a[8] = {3,1,5,7,2,4,9,6};  cout<<"初始值:";  for(int j= 0; j<8; j++){  cout<<a[j] <<"  ";  }  cout<<endl<<endl;  selectSort(a, 8);  print(a,8,8);
} 

JAVA代码如下:

public class SimpleSort {private  static void simpleSort(){int[] number = {2,3,4,1,6,5};int length = number.length;for (int i=0; i<length-1;i++){//只会进行5轮int min_index = i;for(int j = i+1;j<length;j++){//每轮的比较if(number[min_index]>number[j]){//找到最小值得下标min_index =j;}}if(min_index!=i){//交换最小数number[min_index]和第i位数的位置int temp = number[min_index];number[min_index] = number[i];number[i] =temp;}System.out.print("第"+(i+1)+"次排序:");for(int k=0; k<length;k++){System.out.print(number[k]+" ");}System.out.println("");}}public static void main(String[] args){simpleSort();}
}

四、算法有略分析:

1、时间复杂度为O(n*2);

2、空间复杂度O(1) ;

3、假设待排序的系列有n个元素,则比较次数总是n(n-1)/2;

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

数据结构排序算法——选择排序(简单选择排序)相关推荐

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

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

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

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

  3. Hark的数据结构与算法练习之简单选择排序

    /** 简单选择排序*/ public class SimpleSort {public static void main(String[] args) {int[] arrayData = { 5, ...

  4. 排序算法入门之简单选择排序

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在学了冒 ...

  5. python选择排序算法图解_简单选择排序算法(C语言详解版)

    该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...

  6. 选择排序java代码_JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  7. 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)

    *排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...

  8. 算法一之简单选择排序

    一.  选择排序的思想 选择排序的基本思想是:每一趟在n-i+1(i=1,2,-n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序. ...

  9. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  10. 【排序】几种简单的排序(冒泡、选择、插入)(一)

    PAT[甲级]的相关要求:      在达到乙级要求的基础上,还要求: 具有充分的英文阅读理解能力: 理解并掌握基础数据结构,包括:线性表.树.图: 理解并熟练编程实现经典高级算法,包括哈希映射.并查 ...

最新文章

  1. Java:形式参数问题和返回值问题
  2. linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)
  3. 使用SSH执行远程登录
  4. 相对湿度计算软件_空调工程负荷详细计算方法(附有实例)
  5. java泛型的作用及其基本概念
  6. 中职读计算机什么专业好,读职校选择什么专业好一些
  7. 经典案例之MouseJack
  8. python 打印输出xml数据问题
  9. android root统计,《全球安卓手机 Root 数据报告》:学生党竟然是Root的骨灰级爱好者?...
  10. cpu温度过高 ubuntu_Ubuntu/Debian 查看CPU温度的方法
  11. 网站漏洞修复之苹果cms电影系统
  12. Python课堂点名器,妈妈再也不会担心我被老师点名了
  13. 日志收集之--将Kafka数据导入elasticsearch
  14. MathML与SVL
  15. 支付行业-银行渠道对接
  16. airsim-使用Image api保存机载摄像机的图片
  17. stc15系列c语言pwm编程,stc15f2k60s2单片机 pwm程序 可调占空比
  18. 对勾和叉怎么打_word中插入打勾符号和打叉符号方法
  19. [易飞]如何制作自定义报表
  20. Hutool导出Excel,在一个单元格设置多个字体样式

热门文章

  1. 美国次级房贷风波蔓延 全球爆发小型金融危机
  2. Terrain Splatting
  3. java nullable_@Nullable和@NotNull注释的使用
  4. 语文世界杂志语文世界杂志社语文世界编辑部2022年第9期目录
  5. PyTorch学习笔记-Convolution Layers与Pooling Layers
  6. pyaudio usb playback_Behringer的X2222USB是一款22输入2/2总线调音台和USB音频接口
  7. 17.使用CSS完成视差滚动效果?
  8. WIN7 背景设置浅绿色 保护眼睛
  9. linux基础与安全,Linux 基础优化与安全总结
  10. C#:OleDbDataAdapter