基本排序算法之——插入排序

Posted 零一编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本排序算法之——插入排序相关的知识,希望对你有一定的参考价值。

基本排序算法之——插入排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

基本排序算法之——插入排序


最坏时间复杂度:O(N^2)

最有时间复杂度:O(N)

最坏空间复杂度:总共O(N),需要辅助空间O(1)


直接插入排序(稳定排序)

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

时间复杂度:平均时间复杂度为O(n^2)。

1def insertSort(relist):
2    len_ = len(relist)
3    for i in range(1,len_):  
4        for j in range(i):
5            if relist[i] < relist[j]:
6                relist.insert(j,relist[i])  # 首先碰到第一个比自己大的数字,赶紧刹车,停在那,所以选择insert
7                relist.pop(i+1)  # 因为前面的insert操作,所以后面位数+1,这个位置的数已经insert到前面去了,所以pop弹出
8                break
9    return relist
二分插入排序(稳定排序)

基本思路:同直接插入排序,只是寻找插入位置的方法不同,使用二分法确定插入位置;

时间复杂度:平均时间复杂度为O(n^2)。

 1/*
2  * 二分插入排序
3  */
4static void binaryInsertSort(int []array){
5    int left,right,mid,temp;
6    for(int i=0;i<array.length;i++)
7    {
8        temp=array[i];
9        left=0;
10        right=i-1;
11        mid=0;
12        while(left<=right){
13        mid=(left+right)/2;
14        if(temp<array[mid])
15        right=mid-1;
16        else{
17            left = mid+1;
18        }
19    }
20    for(int j=i-1;j>=left;j--){
21        array[j+1]=array[j];
22    }
23    array[left]=temp;
24    }
25}



希尔排序(不稳定排序)

基本思路:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。

 时间复杂度:平均时间复杂度为O(nlogn) 

 1/*
2  * 希尔排序
3  */

4static void xierInsertSort(int []array){
5    int interval=array.length;
6    while(true){
7        interval=interval/2;
8        for(int i=0;i<array.length;i++){
9            directInsertSort(array,i,interval);
10        }
11        if(interval==1)
12            break;
13    }
14}




概述


一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

1、从第一个元素开始,该元素可以认为已经被排序

2、取出下一个元素,在已经排序的元素序列中从后向前扫描

3、如果该元素(已排序)大于新元素,将该元素移到下一位置

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

5、将新元素插入到该位置后

6、重复步骤2~5



以上是关于基本排序算法之——插入排序的主要内容,如果未能解决你的问题,请参考以下文章

算法之希尔排序快速排序二分查找

7种基本排序算法的Java实现

排序算法之希尔排序

图解排序算法之希尔排序

图解排序算法之希尔排序

面试之插入排序算法