一、选择排序

  1、基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
  
  2、实例

  3、算法实现

  1.    /**
  2. * 选择排序算法
  3. * 在未排序序列中找到最小元素,存放到排序序列的起始位置
  4. * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。
  5. * 以此类推,直到所有元素均排序完毕。
  6. * @param numbers
  7. */
  8. public static void selectSort(int[] numbers)
  9. {
  10. int size = numbers.length; //数组长度
  11. int temp = 0 ; //中间变量
  12.  
  13. for(int i = 0 ; i < size ; i++)
  14. {
  15. int k = i; //待确定的位置
  16. //选择出应该在第i个位置的数
  17. for(int j = size -1 ; j > i ; j--)
  18. {
  19. if(numbers[j] < numbers[k])
  20. {
  21. k = j;
  22. }
  23. }
  24. //交换两个数
  25. temp = numbers[i];
  26. numbers[i] = numbers[k];
  27. numbers[k] = temp;
  28. }
  29. }

二、插入排序

  1、基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。

  2、实例

  

  3、算法实现

  1. /**
  2. * 插入排序
  3. *
  4. * 从第一个元素开始,该元素可以认为已经被排序
  5. * 取出下一个元素,在已经排序的元素序列中从后向前扫描
  6. * 如果该元素(已排序)大于新元素,将该元素移到下一位置
  7. * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  8. * 将新元素插入到该位置中
  9. * 重复步骤2
  10. * @param numbers 待排序数组
  11. */
  12. public static void insertSort(int[] numbers)
  13. {
  14. int size = numbers.length;
  15. int temp = 0 ;
  16. int j = 0;
  17.  
  18. for(int i = 0 ; i < size ; i++)
  19. {
  20. temp = numbers[i];
  21. //假如temp比前面的值小,则将前面的值后移
  22. for(j = i ; j > 0 && temp < numbers[j-1] ; j --)
  23. {
  24. numbers[j] = numbers[j-1];
  25. }
  26. numbers[j] = temp;
  27. }
  28. }

  

4、效率:

时间复杂度:O(n^2).

三、希尔算法

1、基本思想:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

2、操作方法:

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

希尔排序的示例:

3、算法实现:

  1. /**希尔排序的原理:根据需求,如果你想要结果从大到小排列,它会首先将数组进行分组,然后将较大值移到前面,较小值
  2. * 移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强
  3. * 版的插入排序
  4. * 拿数组5, 2, 8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列
  5. * 5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较
  6. * 此例子是按照从大到小排列,所以大的会排在前面,第一次排序后数组为9, 2, 8, 5, 1, 3,4
  7. * 第一次后increment的值变为3/2=1,此时对数组进行插入排序,
  8. *实现数组从大到小排
  9. */
  10.  
  11. public static void shellSort(int[] data)
  12. {
  13. int j = 0;
  14. int temp = 0;
  15. //每次将步长缩短为原来的一半
  16. for (int increment = data.length / 2; increment > 0; increment /= 2)
  17. {
  18. for (int i = increment; i < data.length; i++)
  19. {
  20. temp = data[i];
  21. for (j = i; j >= increment; j -= increment)
  22. {
  23. if(temp > data[j - increment])//如想从小到大排只需修改这里
  24. {
  25. data[j] = data[j - increment];
  26. }
  27. else
  28. {
  29. break;
  30. }
  31.  
  32. }
  33. data[j] = temp;
  34. }
  35.  
  36. }
  37. }

4、效率

 时间复杂度:O(n^2). 

4、各种算法的时间复杂度

  

冒泡排序、快速排序可查看:http://www.cnblogs.com/0201zcr/p/4763806.html

归并排序、堆排序可查看:http://www.cnblogs.com/0201zcr/p/4764705.html

  致谢:感谢您的耐心阅读!

必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】的更多相关文章

  1. 常用算法Java实现之选择排序

    选择排序算法在每一步中选取最小值来重新排序,通过选择和交换来实现排序. 具体流程如下: 1.首先从原数组中选择最小的1个数据,将其置于第一个位置. 2.然后从剩下的数据中再选择其中最小的一个数据,并将 ...

  2. 排序算法Java实现(选择排序)

    算法描述:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换:重复 ...

  3. 算法-java代码实现选择排序

    选择排序  

  4. appium+java(二)appium初始化参数部分详解

    Capabilities介绍 实际上它的全称是:Desired capabilities Desired capability是一个JSON对象,包含一组key和value值.它由客户端发送给服务端, ...

  5. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  6. 常见排序算法总结分析之选择排序与归并排序-C#实现

    本篇文章对选择排序中的简单选择排序与堆排序,以及常用的归并排序做一个总结分析. 常见排序算法总结分析之交换排序与插入排序-C#实现是排序算法总结系列的首篇文章,包含了一些概念的介绍以及交换排序(冒泡与 ...

  7. 算法——蛮力法之选择排序和冒泡排序c++实现

    这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出 ...

  8. 【Java基础】选择排序、冒泡法排序、二分法查找

    1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...

  9. 基于python语言的经典排序法(冒泡法和选择排序法)

    前 每逢周末就遇雨期,闲暇之余,捣鼓了下python,心心念想学习,今天就在电脑上装了个2.7,学习了下经典算法,冒泡与选择排序法 第一次写关于python的文章,说的不当之处,多多指正,我积极改正 ...

  10. Java 8系列之Stream的基本语法详解

    本文转至:https://blog.csdn.net/io_field/article/details/54971761 Stream系列: Java 8系列之Stream的基本语法详解 Java 8 ...

随机推荐

  1. java三种实现线程的方法比较

    1.继承Thread 2.实现Runnable 1和2的比较,1可以创建不同的任务,每个任务互不干扰,对于2,相当于只执行一个任务,多个任务之间互相影响,比如售票系统,每售出一张票,票数都要减1,这个 ...

  2. 我们为什么要配置CATALINA_HOME环境变量

    用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读.在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOM ...

  3. Struts1 中提交中文表单到ActionForm后出现乱码问题的原因及处理方法

    问题: 在你所有页面设置的编码都是utf-8的情况下仍然会出现中文乱码现象. 一.乱码出现原因 由于Struts框架直接把表单数据发送给了ActionForm,所以这里面没有对HttpRequestS ...

  4. javascript脚本设置输入框只读的问题

    今天在开发中准备通过javascript设置input框只读属性的时候,用document.getElementById('input').readonly='readonly';结果发现这样设置无效 ...

  5. Spring4学习笔记 - SpEL表达式

  6. 用T4 Template生成代码

    1 T4语法 T4的语法与ASP.NET的方式比较类似.主要包括指令.文本块.控制块. 1.1    指令 指令主要包括template, output, assembly, import, incl ...

  7. jQuery+fullPage.js演示10种全屏滚动

    基本演示 背景演示 循环演示 回调函数演示 绑定菜单演示 项目导航演示 自动滚动 slide自动滚动 响应式 下载地址 实例代码 <!DOCTYPE html> <html lang ...

  8. WPF实现强大的动态公式计算

    数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题. 1.VS2012新建一个WPF应用程序WpfApp ...

  9. oracle表的管理

    表名和列的命名规则 必须以字母开头: 长度不能超过30字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z,a-z,0-9,$,#等:   数据类型: 字符型: char       定长 ...

  10. HTML5夜空烟花绽放动画效果

    模板描述:HTML5夜空烟花绽放动画效果基于HTML5 canvas制作,模拟夜空烟花绽放动画效果,烟花会在夜空打出贺词,有新年快乐.合家幸福.万事如意.心想事成.财源广进等,文字可以自定义,做成各种 ...