插入排序之直接插入排序(Java篇)

来源:互联网 发布:苦海翻起爱恨 知乎 编辑:程序博客网 时间:2024/06/06 17:28

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

直接插入排序

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
例如,已知待排序的一组纪录是:
60,71,49,11,24,3,66
假设在排序过程中,前3个纪录已按关键码值递增的次序重新排列,构成一个有序序列:
49,60,71
将待排序纪录中的第4个纪录(即11)插入上述有序序列,以得到一个新的含4个纪录的有序序列。首先,应找到11的插入位置,再进行插入。可以讲11放入数组的第一个单元r[0]中,这个单元称为监视哨,然后从71起从右到左查找,11小于71,将71右移一个位置,11小于60,又将60右移一个位置,11小于49,又再将49右移一个位置,这时再将11与r[0]的值比较,11≥r[0],它的插入位置就是r[1]。假设11大于第一个值r[1]。它的插入位置应该在r[1]和r[2]之间,由于60已经右移了,留出来的位置正好留给11.后面的纪录依照同样的方法逐个插入到该有序序列中。若纪录数n,续进行n-1趟排序,才能完成。
直接插入排序的算法思路:
(1) 设置监视哨r[0],将待插入纪录的值赋值给r[0];
(2) 设置开始查找的位置j;
(3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止;
(4) 将r[0]插入r[j+1]的位置上。
直接插入排序(由小到大)算法:

 public static void  insertSort()    {        int [] array={1,5,7,9,3,89,67,234,45,76};        System.out.println("排序前的顺序为:");        for(int i : array)        {            System.out.print(i+"\t");        }        //排序算法        int tmp;//岗哨        int j;        for(int i=1;i<array.length;i++)        {            tmp = array[i];            for (j = i - 1; j >= 0 && array[j] > tmp; j--) {                array[j + 1] = array[j];            }            array[j + 1] = tmp;        }        //输出        System.out.println("\n排序后的顺序为:");        for(int i: array)        {            System.out.print(i+"\t");        }    }

程序的排序结果为:
这里写图片描述
直接插入排序(由大到小)算法:

 //直接插入排序实现从大到小进行排序    public static void insertSort2()    {        int array[] = {1,5,7,9,89,67,76,234,45};        System.out.println("排序前的顺序为:");        for(int i : array)        {            System.out.print(i+"\t");        }        System.out.println();        int temp;        int j;        for(int i=1;i < array.length;i++)        {            temp = array[i];            for(j = i-1;j>=0&&temp>array[j];j--)            {                array[j+1] = array[j];            }            array[j+1] = temp;        }        System.out.println("排序后的顺序为:");        for(int i : array)        {            System.out.print(i+"\t");        }    }

程序的排序结果为:
这里写图片描述

0 0
原创粉丝点击