• 排序算法之直接插入排序


    1、基本思想

      在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经有序的,现在要把第n个数插到前面的有序数中,使得这n个数也是有序的。如此反复循环,直到全部排好顺序。这个思想类似打扑克的时候抓牌的情形。

    2、代码示例

    package  sort;
    
    public class InsertSort {
    
        public void TestSort() {
            int a[]={49,38,65,97,76,13,27,49,78,34,34,15,35,25,53,51}; 
            sort(a);
        }
        
        public void sort(int arr[]) {
            int i, j;
            //数组长度。
            int len = arr.length; 
            //临时变量,用于存放当前插入的元素。
            int temp;
            //假定第一个元素arr[0]已经在正确的位置上。
            //则仅需遍历 arr[1]-arr[n-1]列表。
            for (i = 1; i < len; i++) {
                //对于每次遍历,从arr[0]-arr[i-1]范围内的元素已经是有序的。
                //每次遍历的任务是:通过循环前面已排序的子列表,将arr[i]的元素插入到从arr[0]到a[i-1]列表中的正确位置上。
                j = i;
                //将arr[i]复制给temp。
                temp = arr[i];
                //向前循环列表,比较temp与arr[j-1]、arr[j-2]...的大小。
                //当temp大于或等于arr[j-1]或者在列表开始处结束。
                while (j > 0 && temp < arr[j - 1]) {
                    //满足条件,arr[j-1]元素向后移一位。
                    arr[j] = arr[j - 1];
                    j--;
                }
                //循环结束,将temp复制给arr[j]
                arr[j] = temp;
            }
            for (i = 0; i < arr.length; i++){
                System.out.print(arr[i] + " ");
            }
        }
    }

    3、效率分析

      空间复杂度O(1)

      时间复杂度O(n2)

      最差情况:反序,需要移动n*(n-1)/2个元素

      最好情况:正序,不需要移动元素

      数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n)

      插入排序最坏情况运行时间和平均情况运行时间都为O(n2)

  • 相关阅读:
    poj3669 广搜
    检索所有课程都选修的的学生的学号与姓名
    UVA10160 Servicing Stations
    uva11205 The broken pedometer 子集生成
    poj1101 the game 广搜
    poj3009 Curling 2.0 深搜
    poj 1564 Sum It Up 搜索
    HDU 2268 How To Use The Car (数学题)
    codeforces 467C George and Job(简单dp,看了题解抄一遍)
    HDU 2267 How Many People Can Survive(广搜,简单)
  • 原文地址:https://www.cnblogs.com/hehaiyang/p/4754479.html
Copyright © 2020-2023  润新知