我们看这样一个数组:array={12,23,9,24,15,3,18}如何按从小到大顺序用选择排序算法实现??

我们用插入排序算法的思维先选择排序的过程:

先从数组中依次选出一个假定最小数,然后依次和后面的数比较大小,记录下实际最小数的下标,并在一趟比较完之后,将假定最小数和实际最小数调换位子!

我们注意到在比较过程中,我们要先选定“假定最小数”,再拿这个假定的比较数和后面没有排序的数比较,得出实际最小数!

注意这里:第一趟:我们先选“假定最小数”, 选完后依次比较--------这里就涉及到会有几趟,每趟会比较几次的问题;

我们将问题用实际例子画个流程图出来:

拿数组array:我们先定义每趟的假定最小值的下标是minIndex,最小值是min

index—> 0   1   2  3  4  5   6

array={12,23,9,24,15,3,18}

第一趟:minIndex=0 ,index=12

第1次比较:<0,1>比较(指数组下标对应的值)

minIndex=0 ,min=12

第2次比较:<0,2>

minIndex=0 ,min=12

第3次比较:<0,3>

minIndex=0 ,min=12

第4次比较:<0,4>

minIndex=0 ,min=12

第5次比较:<0,5>

minIndex=5 ,min=3

第6次比较:<5,6>

minIndex=5 ,min=3                                                 index——>0  1  2  3   4  5    6

第一趟比较的结果:假定最小值的下标是0 ,实际最小值的下标是5,两者交换值:     array={3,23,9,24,15,12,18}

第二趟:minIndex=1 ,index=23

第1次比较:<1,2>比较(指数组下标对应的值)

minIndex=2 ,min=9

第2次比较:<2,3>

minIndex=2 ,min=9

第3次比较:<2,4>

minIndex=2 ,min=9

第4次比较:<2,5>

minIndex=2 ,min=9

第5次比较:<2,6>

minIndex=2 ,min=9

第二趟比较的结果:假定最小值的下标是1 ,实际最小值的下标是2,两者交换值:     array={3,9,23,24,15,12,18}

就这样一直比较直到结果出现:[3, 9, 12, 15, 18, 23, 24]

我们可以看出:

1.比较的趟数时array.length-1

2.每次取无须数组的第一个数作为假定的最小值,它的比较次数是剩余数组形成的无序数组的length-1

3.那么比较趟数i和内部比较次数j的关系:  j=len-i(假设i从1开始)

根据这个可以得到程序:(注意:后来证明字体大的部分逻辑是错误的,因为对于子无序数组而言,假定最小值就是是实际最小值时,后面的数组排序不一定是排序好的)为什么在代码中红色显示不了呢??

/**选择排序思想:每次从无序序列中选择第一个数为假定最小值,依次后后面的数比较,存在更小的数,与其交换位置* @param args*/public static void main(String[] args) {// TODO Auto-generated method stubint array[]={12,23,9,24,15,3,18};int len=array.length;//外层控制趟数 7-1=6趟for(int i=1;i<=len-1;i++)   {int minIndex=i-1;int min=array[minIndex];boolean flag=false;          //在i趟时,是否存在比假定最小数更小的数存在  boolean boolNoSmall=false;   //标记值:判断假定最小数是否是在这一趟中的实际最小数,如果是,那么后面的循环就不用了
            //内层控制比较次数  剩下几个数就比较len-1次for(int j=len-i;j>=1;j--){boolNoSmall=false;if(array[len-j]<min){minIndex=len-j;min=array[minIndex];flag=true;           //假定最小数不是实际最小数,标志值}if(minIndex==(i-1))      //假定最小值就是实际最小值,数组已经排序好
                    boolNoSmall=true;}if(boolNoSmall)               //假定最小值就是实际最小值,数组已经排序好break;
            if(flag)                      //假定错误,交换两个数{int temp=array[i-1];array[i-1]=min;array[minIndex]=temp;}}System.out.println(Arrays.toString(array));}

注意程序上方红色部分是对程序的优化:

上方的程序是从i=1开始计数,也就是程序的趟数(第1趟。。。。。)开始。平时我们还是应该从数组的对应下标开始计数更加符合实际情况,但是我们为了便于理解,这样写也ok啦

正确的算法

public static void  sort(){int array[]={1,12,23,9,24,15,3,18};int len=array.length;int minIndex,min;     //定义每次的假定最小值和最小坐标//外层循环控制趟数:0———len-1即(0——5)for(int i=0;i<len-1;i++){minIndex=i;min=array[minIndex]; //初始化每次的假定最小值和最小坐标boolean flag=false; //假定最小值是否存在比其更小的数//开始第i+1趟//内部循环控制每趟比较的次数//每次都得比较 len-i-1,每次比较至少比较1次(j>=1)for(int j=len-i-1;j>=1;j--){if(array[len-j]<array[minIndex])  //存在比其更小的数{minIndex=len-j;flag=true;}}if(flag)  //交换数据{int temp=array[minIndex];array[minIndex]=array[i];array[i]=temp;}}System.out.println(Arrays.toString(array));}

给个更快的算法

public static void sort2(){int array[]={1,12,23,9,24,15,3,18};int min;int len=array.length;for(int i=0;i<len-1;i++)  //从0开始{min=array[i];for(int j=i+1;j<len;j++)  //从i+1开始和i比较,{if(array[j]<array[i]){min=array[j];}if(!(min==array[i]))  //直接交换{int temp=array[i];array[i]=array[j];array[j]=temp;}}}System.out.println(Arrays.toString(array));}

转载于:https://www.cnblogs.com/fjsnail/p/3477691.html

每天一算法之插入排序相关推荐

  1. 插入排序c语言_玩扑克牌中插扑克牌手法就是不一样,C语言经典算法之插入排序...

    插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂.当然,如果你说你打扑克牌摸牌的时候从来不按牌的大小整理牌,那估 ...

  2. 排序算法 | 直接插入排序算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接插入排序算法的图解.实现.复杂度和稳定性分析 目录 1.直接插入排序定义 2.直接插入排序,步骤说明 3.动态图演示 4.代码实现,运行结果 5.算法分析 ① 时间复杂度分析 ② 空 ...

  3. Java常见排序算法之插入排序

    一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...

  4. java数据结构排序实验报告_java数据结构与算法之插入排序详解

    本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...

  5. 数据结构与算法 | 直接插入排序、希尔排序

    前几章讲了选择排序中的直直接选择排序.双向选择排序.堆排序,这次来讲讲利用'插入'为核心来实现的插入排序算法. 插入排序 把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所 ...

  6. 数据结构与算法之插入排序

    数据结构与算法之插入排序 目录 插入排序介绍 插入排序思路分析 代码实现 1. 插入排序介绍 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的. 2. 插 ...

  7. 插入排序 php,常用的排序算法(二)--插入排序(PHP实现)

    常用的排序算法系列 插入排序 插入排序是一种逻辑上非常好理解的排序方式,整个排序的核心就是不断在当前已经排好部分数据的数组里,找到合适的位置插入新数据.就像抓扑克牌,抓一张,然后再手里已经部分已经排好 ...

  8. python 从大到小循环_python算法(3) 插入排序

    python算法(3) 插入排序 算法分析 给出一个乱序的数列,将这个数列按从小大到(从大到小)重新排列 插入排序的的逻辑是从选这个数列,一个一个的插入一到一个新的数列中 如下: 初始数列: 5 1 ...

  9. 插入排序算法 java_排序算法实现-插入排序(Java版本)

    原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...

  10. 数据结构与算法:十大排序算法之插入排序

    数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...

最新文章

  1. Oracle trunc()函数的用法
  2. python编辑器对比和推荐
  3. vc++ 项目里External dependencies 的文件存放内容和各个文件的存放内容
  4. PHP随机静态页面生成系统源码雨尘SEO系统
  5. 地图距离算法_基于权重的地图匹配技术
  6. 华为员工吐槽加班太多,晒出7天上班打卡记录网友:不怕猝死吗?
  7. 魔域单机服务器显示read,魔域boss点,单机假设相关信息(Demon boss point, single machine assumes relevant information).doc...
  8. 欧文分校的计算机科学博士,2020年加州大学欧文分校博士含金量
  9. SO逆向之x博国际版登陆分析
  10. 云虚拟主机、云服务器、VPS三者有什么区别?
  11. java丶JsonObject 的使用
  12. 【九层之台】Web开发教程:1. 基础
  13. 决定未来的八大核心科技
  14. 【思维导图】冒险岛职业分类(按职业系、职业群分类)
  15. 计算机简单的装机维修,超详细!用装机员pe自己动手给电脑装win7系统
  16. 大一下学期微积分期末预习(3):定积分的应用-求旋转体的体积
  17. 物资配送路径问题(一)
  18. 2019宽德投资软件开发工程师实习生面试
  19. 在windows系统中使用Ceres非线性优化库:(一)安装Ceres库
  20. 问题:AssertionError: Torch not compiled with CUDA enabled

热门文章

  1. 远程linux服务器,安装集成的xampp,本地电脑远程连接数据库进行使用
  2. 用计算机代替人工记账缺陷,会计电算化的实施过程是什么
  3. 苹果CMSv10自适应高权重模板源码
  4. 华为5G微交易修复版源码 K线/结算全修复 去短信+去邀请码
  5. 20个最佳WordPress SEO插件
  6. 你应该升级到SQL Server 2005还是SQL Server 2008?
  7. CodeIgniter中URL含有中文字符串的解决方案
  8. pip安装指定版本包
  9. Linux tail命令:显示文件结尾的内容
  10. 方法的重载 c# 1613699221