插入排序-直接插入排序、希尔排序

插入排序是一类借助‘插入‘进行排序的算法,主要思想:每次将一个待排序的记录按其关键码大小插入到一个已经排好序的有序序列中,直到全部记录排好序。

一、直接插入排序

直接插入排序是插入排序最简单的算法,类似于玩纸牌时整理手中纸牌的过程。基本思想:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好。代码如下:

 1 /*插入排序*/
 2 function sort(arr) {
 3               var len=arr.length,temp=0,i,j;
 4               arr.unshift(temp);
 5               for(i=2;i<=len;i++){
 6                    arr[0]=arr[i];
 7                    for(j=i-1;arr[0]<arr[j];j--){
 8                         arr[j+1]=arr[j];
 9                    }
10
11                    /*j=i-1;
12                    while(arr[0]<arr[j]){
13                         arr[j+1]=arr[j];
14                         j--;
15                    }*/
16
17                    arr[j+1]=arr[0];
18               }
19               arr.shift(arr[0]);
20               return arr;
21  }
22 console.log(sort([5, 100, 6, 3, -12]));

效率:

时间复杂度:最好:O(n),最坏:O(n^2),平均:O(n^2)。

空间复杂度:O(1)。

稳定性:稳定

直接插入排序算法简单,容易实现,当序列中的记录基本有序或者待排序记录较少时,它是最佳的排序方法。但是,当待排序的记录个数较多时,大量的比较和移动操作使得效率很低。

二、希尔排序

希尔排序是对直接插入排序的改进,基本思想:先将整个待排序记录序列分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。代码如下:

 1 function shellSort(arr){
 2     var length=arr.length;
 3     var temp,d;
 4     for(d=Math.floor(length/2);d>=1;d=Math.floor(d/2)){//以增量d进行直接插入排序
 5         for(var i=d;i<length;i++){
 6             temp=arr[i];//暂存被插入的记录
 7             for(var j=i-d;j>=0&&temp<arr[j];j=j-d){
 8                 arr[j+d]=arr[j];//记录后移d个位置
 9             }
10             arr[j+d]=temp;
11         }
12     }
13     return arr;
14 }
15 shellSort([59,20,17,36,98,14,23,83,13,28]);

效率:

时间复杂度:最好:O(nlog2n)~O(n^2),最坏:O(n^1.3),平均:O(n^2)。

空间复杂度:O(1)。

稳定性:不稳定

时间: 2024-08-11 05:45:28

插入排序-直接插入排序、希尔排序的相关文章

插入排序算法之希尔排序

一.前沿: 希尔排序(Shell Sort)的名称源于它的发明者Donald Shell,该算法是冲破了二次元时间屏障的算法之一.它通过比较相距一定间隔的元素工作,各趟所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟为止,因此希尔排序有时也叫做缩减增量排序(diminishing increament sort). 二.详细步骤: 希尔排序使用一个序列h1,h2,......ht 叫做   增量序列,只要h1=1,任何增量序列都是可行的,在使用hk的一趟增量序列后,数组中任何a[i]

php实现的冒泡,插入排序,希尔排序,归并排序

<?php/***选择排序也就是冒泡排序,就是基于各个数据之间的对比来排序**/$arr = array(2,1,7,5,8,9,3,4,10,30,28,24);function bubbleSort($arr) {    $len = count($arr);    $k = 0;    for($i=0;$i<$len;$i++){    $k++;        for($j=$i+1;$j<$len;$j++) {            if($arr[$i] > $ar

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,

算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序

排序的元素实现了Comparable接口,以达到对于通用性. 最基础的排序是冒泡排序,下面是其思路: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 下面是其实现代码: public class Maopao { public void sort(Comparable[]

从直接插入排序到希尔排序

目录 从直接插入排序到希尔排序 希尔算法的流程 希尔算法的性能分析 Code 应试知识点 从直接插入排序到希尔排序 直接插入排序,它的原理就是把前i个长度的序列变成有序序列,然后循环迭代,直至整个序列都变为有序的.但是说来说去它还是一个时间复杂度为(n^2)的算法,难道就不能再进一步把时间复杂度降低一阶么? 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是直接插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n

排序--ShellSort 希尔排序

希尔排序 no 实现 希尔排序其实就是插入排序.只不过希尔排序在比较的元素的间隔不是1. 我们知道插入排序 都是 一个一个和之前的元素比较.发现比之前元素小就交换位置.但是希尔排序可能是和前第n个元素比较,如果发现比前第n个元素小就和前第n个元素交换位置.具体看下图 第一趟比较.n是为5.也就是说每个数和前面第5个数比较.如果发现小于前面第5个数的话.交换位置. 所以我们看到 72 比 592 小. 所以交换位置. 283 比 348 小.继续交换 第二趟比较. n 是2.同理 最后一次比较.n

算法 - 希尔排序(C)

/* ShellSort.c - by Chimomo 希尔排序又称"缩小增量排序",是对直接插入排序方法的改进. 希尔排序的基本思想是:先将整个待排序序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序. 具体做法是:先取一个小于n的整数d1作为第一个增量,将所有距离为d1倍数的记录放在同一个组中,从而把全部记录分成d1组,在各组内进行直接插入排序:然后取第二个增量d2(d2<d1),重复上述分组和排序工作,依此类推,直

python数据结构与算法 33 希尔排序

希尔排序 希尔排序,有时称为递减增量排序,是在插入排序基础上,把列表拆成几个较小的子表,然后对每个子表使用插入排序的方法.选出子表的方法是希尔排序的关键,它并不是把列表的中相近的元素取出来组成子表,而是使用了一个增量值I,有时也叫做"间隙",然后每隔一个间隙选中一个元素来组成子表. 这可以从图6中看出来,列表中有9个元素,如果我们使用增量3,就有3个子表,每个子表单独做插入排序.完成之后的列表如图7,现在看这个表虽然没有完全排序,但对子表排序后,元素已经很接近它们的最终位置. 图6 增

排序——希尔排序

希尔排序(Shell Sort)是插入排序的一种.是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 希尔排序的实现代码: #inclu

数据结构和算法之排序六:希尔排序

经过前面五篇排序方法的介绍,我们了解到了递归思想以及分而治之的归并和快速排序,当然也涉及到了比较简单易懂的数据值传递冒泡,选择,以及插入排序.可以说每一种排序方式都各有千秋,都适合在不同的环境下进行使用,但是我们有时会不会思考一个问题,那就是我们在学习插入排序的时候的主题思想是将每一个数据取出来,然后和后边的前边的数据逐一进行比较,那么,我们是不是要进行N-1次的循环,或者说我们是不是要进行大约N的平方次比较,我们知道,在进行值的交换和比较是非常消耗时间的,那么是不是违背了我们算法的发展.有没有