算法 直接插入排序小述

版权声明:转载请声明: https://blog.csdn.net/MingJieZuo/article/details/83418342

一、概述

本节主要简单介绍一下直接插入排序算法,直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。摘自百度百科

二、分析

假如现在有一个具有n+1个元素的序表,即table[0, n],现将该序表组成元素分为有序和待排序两部分,默认即tableSorted[0, 1)和tableToBeSorted[1, n],随后我们将tableToBeSorted待排序列表中的第0个元素插入到tableSorted有序列表之中,组成新的有序列表和待排序列表,即tableSorted[0, 1]和tableToBeSorted[2, n],重复此操作,直到待排序列表元素个数为0,即序表元素全部有序

三、代码展示

根据自己对于直接插入排序算法的理解,我将算法思路分成了三步,首先我们需要确定待排序数字在有序列表中的插入位置,其次我们将有序列表中该位置后的元素统一往后挪一位,最后我们将待排序数字放在该位置上,正序代码如下:

    // 这是根据定义写的思路代码,不是最终代码
    private static int[] insertionSort(int[] dataToBeSorted) {
        int length = dataToBeSorted.length;
        for(int i=1; i<length; i++) {
            // 将待排序数字保存起来
            int temp = dataToBeSorted[i];
            // 记录插入的位置
            int index = i;
            for(int j=i-1; j>=0; j--){
                // 为了更直观,判断语句就不放在循环体里了
                if(dataToBeSorted[j] > dataToBeSorted[i]){
                    // 记录待排序数字应该插入的位置
                    index--;
                }else{
                    break; 
                }
            }
            if(index != i){
                // 在有序数列里,将插入位置后面的数字,统一往后挪一位
                for(; i>index; i--){
                    dataToBeSorted[i] = dataToBeSorted[i-1];
                }
                // 在需要插入的位置上,赋值
                dataToBeSorted[index] = temp;
            }
        }
        return dataToBeSorted;
    }

虽然功能实现了,但代码却存在着很大的问题,首先在时间复杂度上,我们进行了三次循环,其次在空间复杂度上我们使用了temp、index两个中间变量存储值,所以这样写效率很低。之后我再想,能不能在获取插入位置的时候,就直接挪位呢?当然看了看网上的写法[流汗][哈哈],最后代码如下

    private static int[] insertionSort(int[] dataToBeSorted) {
        int length = dataToBeSorted.length;
        for(int i=1; i<length; i++) {
            int temp = dataToBeSorted[i];
            int j = i-1;
            // 如果待排序的数字小于前面紧挨的数字
            for(; j>=0 && temp<dataToBeSorted[j]; j--){
                // 前面的数字将后面的数字覆盖掉,相当于往后挪了一位
                dataToBeSorted[j+1] = dataToBeSorted[j];
            }
            // 如果有序列表有数字挪位了,即需要做插入操作了
            if(j != i-1){
                // 将待排序数字插入到相应位置
                dataToBeSorted[j+1] = temp;
            }
        }
        return dataToBeSorted;
    }

四、总结

当然代码编写并不是固定的,肯定会有很多变形格式,其实我们研究的也是其直接插入的思想和每种写法的效率问题。如果想要查看更多算法基础,去我的博客目录里查看吧,因为关于每块知识点的介绍,博客单节写的比较零散,不容易查找。

猜你喜欢

转载自blog.csdn.net/MingJieZuo/article/details/83418342