1.直接插入排序

  时间复杂度O(n2)

  工作原理:

  通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入。

  插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间。

  

  1. //直接插入排序
  2. public static void InsertSort(int[] a,int n){
  3. int i,j,t;
  4. for(i=1;i<n;i++){
  5. t=a[i];//取出一个未排序的数据
  6. for(j=i-1;j>=0&&t<a[j];--j){//在已排序的序列这查找位置,t<a[j],说明要把t插入到前面去
  7. a[j+1]=a[j];//向后移动数据
  8. }
  9. a[j+1]=t;//将临时元素插入到腾出的位置中
  10. }
  11. }

2.希尔排序

  希尔排序是插入排序的一种高效率的实现,也叫缩小增量排序。简单的插入排序中,如果待排序列是正序时,时间复杂度是O(n),如果序列是基本有序的,使用直接插入排序效率就非常高。希尔排序就利用了这个特点。

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

  (1)间隔的计算:

     间隔h的初始值为1,通过h=3*h+1来循环计算,直到该间隔大于数组的大小时体质。最大间隔不大于数组大小的最大值,如:数组长度为10,最大间隔可以为4

  (2)间隔的减少:

       可以通过h=(h-1)/3来计算

    

  1. package com.sort;
  2.  
  3. /*希尔排序*/
  4. public class ShellSort {
  5.  
  6. public static void shellSort(int[] arr){
  7. //初始化一个间隔
  8. int h=0;
  9. //计算最大间隔
  10. while (h<arr.length/3+1) {//当arr.length=10时,发现h=4时合适
  11. h=h * 3+1;
  12.  
  13. }
  14. while (h>0) {
  15. //进行插入排序
  16. int target=0;
  17. for (int i = h; i < arr.length; i++) {//i=1是第二个数,假设第一个数的位置是正确的;要往后移,必须要假设第一个
  18. target=arr[i];//待插入的
  19. int j=i;
  20. //后移
  21. while (j>h-1 && target<=arr[j-h]) {
  22. arr[j]=arr[j-h];//按间隔的距离得到要交换的两个数
  23. j-=h;
  24. }
  25.  
  26. arr[j]=target;
  27. }
  28. //减小间隔
  29. h=(h-1)/3;
  30. }
  31. }
  32. }
  33. TestShellSort
  34. package com.sort;
  35.  
  36. public class TestShellSort {
  37.  
  38. public static void main(String[] args) {
  39. int[] arr=new int[9];
  40. arr[0]=9;
  41. arr[1]=1;
  42. arr[2]=5;
  43. arr[3]=8;
  44. arr[4]=3;
  45. arr[5]=7;
  46. arr[6]=4;
  47. arr[7]=6;
  48. arr[8]=2;
  49.  
  50. System.out.print("[");
  51. for (int num : arr) {
  52. System.out.print(num+" ");
  53. }
  54. System.out.print("]");
  55. System.out.println();
  56.  
  57. ShellSort.shellSort(arr);
  58. System.out.print("[");
  59. for (int num : arr) {
  60. System.out.print(num+" ");
  61. }
  62. System.out.print("]");
  63. System.out.println();
  64.  
  65. }
  66.  
  67. }

  栗子:

  有些排序算法在每趟排序过程中,都会有一个元素被放置在其最终的位置上,下列算法不会出现此情况的是()

  正确答案: A   你的答案: D (错误)

    A.希尔排序

    B.堆排序

    C.起泡排序

    D.快速排序

直接插入排序&希尔排序的更多相关文章

  1. 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]

    关于冒泡排序,选择排序,插入排序,希尔排序[资料收集]  以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...

  2. 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现

    之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...

  3. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...

  4. 冒泡排序 选择排序 插入排序希尔排序 java

    双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...

  5. 内部排序->插入排序->希尔排序

    文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进. 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是 ...

  6. 插入排序:直接插入排序&希尔排序

    一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...

  7. 插入排序—希尔排序(Shell`s Sort)原理以及Java实现

    希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...

  8. PHP 插入排序 -- 希尔排序

    1.希尔排序 -- Shell Insertion Sort 时间复杂度:数学家正在勤劳的探索! 适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值 ...

  9. 插入排序->希尔排序

    /** * 插入排序 */ public class InsertSort { public static void main(String[] args){ int[] arr = {5,5,2,6 ...

随机推荐

  1. Azure SQL的DTU和eDTU到底是个什么鬼

    可以从上表上对应于本地数据库的性能采集的指标,可以估算出应该使用什么样级别的AZURE SQL. 当然服务层选择后仍然可以进行更改. 对于自己应用应该用多大规模的DTU,可以进行详细的评估,可以使用下 ...

  2. Oracle11g 卸载教程图解

    1:停掉所有Oracle相关的服务 1.1打开服务方式如下: 1.1.1:右击“计算机”–>管理–>服务和应用程序–>服务 1.1.2:开始–>输入“服务”后点击搜索–> ...

  3. 如何让Oracle数据库保持优良性能的方法

    OracleDatabase,又名OracleRDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上流行 ...

  4. Python-Django框架学习笔记——第一课:Hello World

    Python Django 有诗云: 孤山寺北贾亭西,水面初平云脚低. 几处早莺争暖树,谁家新燕啄春泥. 乱花渐欲迷人眼,浅草才能没马蹄. 最爱湖东行不足,绿杨阴里白沙堤. 今天在信阳游玩,有幸来到信 ...

  5. 如何利用BAPI SD_SALESDOCUMENT_CHANGE修改Sales Order的字段

    假设我想修改S/4HANA里Sales Order抬头的Service Date字段SERV_DATE: 首先从数据库表VBKD里查找到SERV_DATE修改之前的值为2020年1月1日 使用如下代码 ...

  6. Python 看书的一些记录 运算符重载

    1.类和模块有什么关系? (1)类是模块的一部分,是模块对象的属性. (2)类和模块都是命名空间,但是类是对于语法的.模块是对于文件的 (3)类支持多个实例,但是模块被导入时只有一个. 2.什么是抽象 ...

  7. user(),current_user()函数的区别

    user() 表示当前的登录用户   current_user() 表示对应于mysql.user表里对应的账号.

  8. 【转】startActivityForResult和setResult详解

    startActivityForResult与startActivity的不同之处在于:1.startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startAct ...

  9. Javascript与C#中使用正则表达式

    JavaScript RegExp 对象 新建一个RegExp对象 new RegExp(pattern,[attributes])           注: \d需要使用[0-9]来代替 参数 参数 ...

  10. C# is运算符

    一.C# is运算符 is运算符用于检查对象是否与给定类型兼容(兼容表示对象是该类型,或者派生于该类型). is运算符用来检查对象(变量)是否属于某种数据类型,如int.string.bool.dou ...