关闭

排序算法总结(2)--插入排序

标签: 排序算法java
55人阅读 评论(0) 收藏 举报
分类:

一、简介

插入排序对于少量元素的排序以及部分有序数组的排序,是一个有效的算法。插入排序的工作原理和整理一手扑克牌的过程一样。开始时,左手为空,每次从桌子上拿一张扑克牌并插入左手正确的位置。为了找到这张牌的正确位置,我们从右到左将它与手中的扑克牌比较,直到找到一张比它小的牌,将它插入这张牌的后面。此时手中所有的牌已经有序。在计算机实现中,为了要给插入的牌腾出位置,需要将一部分元素在插入之前右移。
选择排序的实现有两种方式:1、非递归;2、递归

二、伪代码

1、非递归

    算法:插入排序的非递归算法
    输入:未排序的数组 A
    输出:已排序的数组 A
    InsertionSort(A)
    for j=0 to A.length-1
        key=A[j];
        // 将array[j]插入到已排序的数组[1,...,j-1]中
        i=j-1;
        while i>=0 and A[i]>key
            A[i+1]=array[i];
            i=i-1;
        A[i+1]=key;

2、递归

为了排序A[0,…,n-1],我们递归的排序A[0,…,n-1],然后把A[n-1]插入已经排序的A[0,…,n-1]。

    算法:插入排序的递归算法
    输入:未排序的数组A和需要排序的起始位置p和终止位置r=A.length
    输出:排序好的数组A   
    RecursionInsertionSort(A,p,r)   //排序A[p]到A[r]
        if p<r 
            r=r-1; //因为开始要-1,所以终止位置是A.length
            RecursionInsertionSort(A,p,r);
            insertion(A,p,r);  //将第r个元素插入A[p,...,r-1]中

    insertion(A,p,r) 
        j=r-1;
        key=A[j+1]
        while j>=0 and A[j]>key
            A[j+1]=A[j];
            j--;
        A[j+1]=key;

三、代码实现

1、非递归

public class Method {
    public static void main(String[] args) {
        int[] array={31,41,59,26,41,58};
        insertionSort(array);
    }

    public void insertionSort(int[] array){
        for (int j=1;j<array.length;j++){
            int key=array[j];
            // 将第j个元素插入前面排序好的序列里
            int i=j-1;
            while (i>=0 && array[i]>key) {
                array[i+1]=array[i];
                i--;
            array[i+1]=key;
            }
        }
    }   
}

2、递归

public class Method {
    public static void main(String[] args) {
        int[] array={41,31,59,26,41,58,1,3,78,6,15,0};
        recursionInsertSort(array,0,array.length);
        for(int x:array){
            System.out.print(x+" ");
        }
    }

    public static void recursionInsertSort(int[] array,int p,int r){
        r=r-1;
        if(p<r){
            recursionInsertSort(array,p,r);
            insertion(array,p,r);//将第r个元素插入array[p,...,r-1]中
        }
    }

    public static void insertion(int[] array,int p,int r){
        int j=r-1;
        int key=array[r];
        while(j>=0 && key<array[j]){
            array[j+1]=array[j];
            j--;
        }
        array[j+1]=key; 
    }
}

四、复杂度分析

时间复杂度:
最好情况:O(n)
最坏情况:O(n^2)
平均情况:O(n^2)
空间复杂度:O(1),原址排序

五、注意事项

  1. 对于随机排列的长度为n且元素不重复的数组来说,最坏情况下需要大约n2/2次比较和大约n2/2次移动,最好情况下需要n1次比较和0次交换。
  2. 插入排序对于部分有序的数组效果很好。一下是几种典型的部分有序数组:
    (1). 数组中每个元素距离他最终的位置不远
    (2). 一个有序的大数组接一个小数组
    (3). 数组中只有几个元素的位置不正确
  3. 插入排序在一次循环之后不能确定任何一个元素的最终位置,直到所有蒜素排序好之才能确定元素的最终位置。
0
0

猜你在找
C语言及程序设计(讲师:贺利坚)
Python爬虫工程师培养课程全套(讲师:韦玮)
Python全栈开发入门与实战课(讲师:李杰)
2017软考网络规划设计师视频套餐(讲师:任铄)
2017软考软件设计师视频套餐(讲师:任铄)
2017软考-信息系统项目管理师视频套餐(讲师:任铄)
软考(高级)项目经理实战营(讲师:张传波)
微信公众平台开发套餐(讲师:刘运强)
深度学习原理+实战+算法+主流框架套餐(讲师:唐宇迪)
2017系统集成项目管理工程师通关套餐(讲师:徐朋)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2108次
    • 积分:154
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档