zoukankan      html  css  js  c++  java
  • 插入排序


    • 实现思路:

      1.从数组的第二个数据开始往前比较,即一开始用第二个数和他前面的一个比较,如果 符合条件(比前面的大或者小,自定义),则让他们交换位置。

      2.然后再用第三个数和第二个比较,符合则交换,但是此处还得继续往前比较,比如有 5个数8,15,20,45, 17,17比45小,需要交换,但是17也比20小,也要交换,当不需 要和15交换以后,说明也不需要和15前面的数据比较了,肯定不需要交换,因为前 面的数据都是有序的。

      3.重复步骤二,一直到数据全都排完。

    • 动图演示:

    • 代码实现:

      package 排序;
      
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      public class InsertSort {
      	//输出排序前后的时间,看看大概需要花多久
          public static void main(String[] args){
              SimpleDateFormat startTime = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
              System.out.println("排序开始时间:"+startTime.format(new Date()));
      
              sort();
              
              SimpleDateFormat endTime = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
              System.out.println("排序结束时间:"+endTime.format(new Date()));
      
          }
      
          public static void sort(){
              //测试80万个数据的排序
              int[] arr = new int[800000];
              for (int index = 0; index < 800000; index++) {
                  arr[index] = (int)(Math.random() * 80000);
              }
      
              for (int i = 1; i < arr.length; i++) {
                  int j = i;
                  while (j > 0){
                      if (arr[j] < arr[j-1]){
                          int temp ;
                          temp = arr[j];
                          arr[j] = arr[j-1];
                          arr[j-1] = temp;
                          //System.out.println(Arrays.toString(arr));
                          j--;
                      }else {
                          break;
                      }
                  }
              }
              //System.out.println(Arrays.toString(arr));
          }
      }
      
      
      • 测试结果:

    80万个数据总共耗时:2分零8秒。结果出乎意料。然而在开始写这个文章之前我已经开始了测试冒泡排序和选择排序,同样也是80万个数据,,,,然鹅,快10分钟了,还没结束。。。。估计是没戏了。


    • 性能分析:

      1.属于稳定的排序,适合于数据量小,部分数据有序的情况排序。

      2.如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择

    • 最后:

      在这个文章快写完的时候,刚刚说的冒泡排序测试结果出来了,给大家看看,结果经供参考,由于测试的方法存在科学性和严谨性,不一定真的代表这个算法的实际性能,有不足或错误之处,欢迎留言指正,谢谢~~~~

      花了21分23秒????看来我的冒泡算法有待优化~~~~各位大神如果有比较好的优化方案,欢迎留言指教。谢谢!

      下面是我测试冒泡算法的代码:

      package 排序;
      
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      public class BubbleSort {
          public static void main(String[] args){
      //        int[] arr={1,3,5,8,45,74};
              SimpleDateFormat time = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
              System.out.println(time.format(new Date()));
      
              int[] arr = new int[800000];
              for (int index = 0; index < 800000; index++) {
                  arr[index] = (int)(Math.random() * 80000);
              }
              int temp = 0;
              boolean flag = true;
      
              for (int i = 0;i < arr.length-1;i++ ){
                  for (int j = 0; j < arr.length-1-i ; j++) {
                      if (arr[j] > arr[j+1]) {
                          temp = arr[j];
                          arr[j] = arr[j+1];
                          arr[j+1] = temp;
                          flag = false;
                      }
                  }
      
                  if (flag){
                      break;
                  }else {
                      flag = true;
                  }
              }
      //        System.out.println(Arrays.toString(arr));
              SimpleDateFormat time2 = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
              System.out.println(time2.format(new Date()));
          }
      }
      
      
  • 相关阅读:
    Dockerfile + Nginx.conf文件记录(用于前端项目部署)
    Dockerfile文件记录(用于后端项目部署)
    结合docker发布后端项目(基于gradle包管理)的shell脚本
    结合docker发布前端项目(基于npm包管理)的shell脚本
    Docker+Nginx使用流程(笔记)
    AntDesign getFieldDecorator 获取自定义组件的值
    c++ primer 第五版第七章
    c++ primer 第五版第六章
    c++ primer 第五版第五章
    c++ Primer 第五版习题答案第四章
  • 原文地址:https://www.cnblogs.com/coding-996/p/12275710.html
Copyright © 2011-2022 走看看