代码改变世界
[登录 · 注册]
  • 插入排序——Insertion Sort
  • 1、原理:从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。

    2、思路:

       (1)设置监视哨r[0],将待插入的记录值赋值给r[0];

      (2)设置开始查找的位置j;

      (3)在数组中搜索,搜索 中将第j个记录后移,直到r[0].key>=r[j].key为止

      (4)将r[0]插入r[j+1]的位置上。

    3、举例

      (1)待排序数组:[42, 20, 17, 13, 28, 14, 23, 15]

      (2)第一趟排序:[42, 20, 17, 13, 28, 14, 23, 15]

        将r[0]=42设置为监视哨,将1位置上的数20和监视哨42进行比较,20小于42,将42和20交换。

        排序结果为:[20, 42, 17, 13, 28, 14, 23, 15],此时0-1范围上的数值大小已经排好了。

      (3)第二趟比较:[20, 42, 17, 13, 28, 14, 23, 15]

        将17和42进行比较,17比42小,交换位置,排序结果为:[20, 17, 42, 13, 28, 14, 23, 15]

        将17和20进行比较,17比20小,交换位置,排序结果为:[17, 20, 42, 13, 28, 14, 23, 15]

        排序结果为:[17, 20, 42, 13, 28, 14, 23, 15],此时0-2范围上的数值大小已经排好了。

      (4)第三趟比较:[17, 20, 42, 13, 28, 14, 23, 15]

        将13和42做比较,13比42小,交换位置,排序结果为:[17, 20, 13, 42, 28, 14, 23, 15]

        将13和20做比较,13比20小,交换位置,排序结果为:[17, 13, 20, 42, 28, 14, 23, 15]

        将13和17做比较,13比17小,交换位置,排序结果为:[13, 17, 20, 42, 28, 14, 23, 15]

        排序结果为:[13, 17, 20, 42, 28, 14, 23, 15],此时0-3范围上的数值大小已经排好了。

      (5)第四趟比较:[13, 17, 20, 42, 28, 14, 23, 15]

        将28和42做比较,28比42小,交换位置,排序结果为:[13, 17, 20, 28, 42, 14, 23, 15]

        将28和20做比较,28比20大,不交换位置。

        排序结果为:[13, 17, 20, 28, 42, 14, 23, 15],此时0-4范围上的数值大小已经排好了。

      (6)第五趟比较:[13, 17, 20, 28, 42, 14, 23, 15]

        将14和42做比较,14比42小,交换位置,排序结果为:[13, 17, 20, 28, 14, 42, 23, 15]

        将14和28做比较,14比28小,交换位置,排序结果为:[13, 17, 20, 14, 28, 42, 23, 15]

        将14和20做比较,14比20小,交换位置,排序结果为:[13, 17, 14, 20, 28, 42, 23, 15]

        将14和17做比较,14比17小,交换位置,排序结果为:[13, 14, 17, 20, 28, 42, 23, 15]

        将14和13做比较,14比13大,不交换位置。

        排序结果为:[13, 14, 17, 20, 28, 42, 23, 15],此时0-5范围上的数值大小已经排好了。

      (7)第六趟比较:[13, 14, 17, 20, 28, 42, 23, 15]

        将23和42做比较,23比42小,交换位置,排序结果为:[13, 14, 17, 20, 28, 23, 42, 15]

        将23和28做比较,23比28小,交换位置,排序结果为:[13, 14, 17, 20, 23, 28, 42, 15]

        将23和20做比较,23比20大,不交换位置。

        排序结果为:[13, 14, 17, 20, 23, 28, 42, 15],此时0-6范围上的数值大小已经排好了。

      (8)第七趟比较:[13, 14, 17, 20, 23, 28, 42, 15]

        将15和42做比较,15比42小,交换位置,排序结果为:[13, 14, 17, 20, 23, 28, 15, 42]

        将15和28做比较,15比28小,交换位置,排序结果为:[13, 14, 17, 20, 23, 15, 28, 42]

        将15和23做比较,15比23小,交换位置,排序结果为:[13, 14, 17, 20, 15, 23, 28, 42]

        将15和20做比较,15比20小,交换位置,排序结果为:[13, 14, 17, 15, 20, 23, 28, 42]

        将15和17做比较,15比17小,交换位置,排序结果为:[13, 14, 15, 17, 20, 23, 28, 42]

        将15和14做比较,15比14大,不交换位置。

        排序结果为:[13, 14, 15, 17, 20, 23, 28, 42],此时0-7范围上的数值大小已经排好了。

      插入排序完成。

    4、过程:

    平均时间复杂度:O(n2)

    5、java代码实现:

    /**
     * 插入排序
     * 
     * @author Administrator
     *
     */
    public class InsertSort 
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] arr = new int[] { 42, 20, 17, 13, 28, 14, 23, 15 };
            insertSort(arr);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "  ");
            }
        }
    
        private static void insertSort(int[] a) {
            for (int i = 0; i < a.length - 1; i++) {
                for (int j = i + 1; j > 0; j--) {
                    if (a[j] < a[j - 1]) {
                        int temp = a[j];
                        a[j] = a[j - 1];
                        a[j - 1] = temp;
                    } else {
                        break;
                    }
                }
            }
        }
    
    }
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文:https://www.cnblogs.com/diyishijian/p/7774983.html
Copyright 2008-2020 晋ICP备12007731号-1