zoukankan      html  css  js  c++  java
  • 排序算法(1)--Insert Sorting--插入排序[1]--straight insertion sort--直接插入排序

    作者QQ:1095737364    QQ群:123300273     欢迎加入!

    1.基本思想

      将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止。

    2.实现原理

      每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
      第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
      直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

    3.代码实例

      (1)代码:

    public static void insertsort(int arr[]){
        for(int i = 1;i < arr.length; i ++){
            if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句
                int temp = arr[i];
                int j;
                for(j = i-1; j >= 0 && arr[j] > temp; j --){
                    arr[j+1] = arr[j];//把比temp大或相等的元素全部往后移动一个位置
                }
                arr[j+1] = temp;//把待排序的元素temp插入腾出位置的(j+1)
            }
        }
    }
    public static void main(String[] args) {
        int array[] = {4,2,1,5};
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }
        insertsort(array);
        System.out.println("
    排序之后:");
        for(int element : array){
            System.out.print(element+" ");
        }
    }

      (2)结果:

    排序之前:  
    4 2 1 5 
    排序之后:
    1 2 4 5 

    4.算法分析

      1.当元素的初始序列为正序时,仅外循环要进行n-1趟排序且每一趟只进行一次比较,没有进入if语句不存在元素之间的交换(移动)。此时比较次数(Cmin)和移动次数(Mmin)达到最小值。
    Cmin = n-1    
    Mmin = 0;
            此时时间复杂度为O(n)
      2.当元素的初始序列为反序时,每趟排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移(arr[j+1] = arr[j]),i个元素后移移动次数当然也就为i了,再加上temp = arr[i]与arr[j+1] = temp的两次移动,每趟移动的次数为i+2,此时比较次数(Cmin)和移动次数(Mmin)达到最小值。
             Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2)
          Mmax = (1+2)+(2+2)+...+(n-1+2) = (n-1)*(n+4)/2 = O(n2)  (i取值范围1~n-1)
             此时时间复杂度为O(n2)
      3.在直接插入排序中只使用了i,j,temp这3个辅助元素,与问题规模无关,所以空间复杂度为O(1).
      4.在整个排序结束后,即使有相同元素它们的相对位置也没有发生变化,
                      如:5,3,2,3排序过程如下
                         A--3,5,2,3
                         B--2,3,5,3
                         C--2,3,3,5
         排序结束后两个元素3的相对位置没有发生改变,所以直接插入排序是一种稳定排序。

    5.排序特点

    (1)它是稳定排序,不改变相同元素原来的顺序。
    (2)它是in-place排序,只需要O(1)的额外内存空间。
    (3)它是在线排序,可以边接收数据边排序。
    (4)它跟我们牌扑克牌的方式相似。
    (5)对小数据集是有效的。
  • 相关阅读:
    结构化数据上的 TopN 运算
    Excel 分组后计算
    主流开源 BI 产品对比
    职场人员该学什么程序语言
    Python 并不合适职场编程,SPL 才行
    v-if 和 v-show 到底有什么区别 何时用v-if 何时用v-show
    APP 在退出登录 页面 注意事项
    APP 项目,登录注册页面,注意事项
    input 文本内容 ,才用正则过滤后,内容没有实时更新 的 处理方法
    实现 长按复制粘贴文本
  • 原文地址:https://www.cnblogs.com/yysbolg/p/7445018.html
Copyright © 2011-2022 走看看