zoukankan      html  css  js  c++  java
  • 排序算法之--插入排序

    基本思想:

    看图 ,觉得网上这张图特别形象。就是从牌堆里抓牌,比如先抓个3,在抓个7,在抓个9,在抓个4,把4插到3和7中间,这个时候3不动,后面的牌诺位置空出来给4,

    其实挪动的话更像蜘蛛纸牌挪动,因为7不能先往后挪,不然会把后面的牌给覆盖。所以从后往前挪动,最后腾个位置插4。

    书面一点:

    把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

    上代码:

     public static void insertSort(int[] arr)
        {
            for(int i=1;i<arr.length;i++)//从第二个元素开始
            {
                int nowdata=arr[i];//记录要插入的数值
                int k=0;
                for( k=i-1;  k>=0 &&  arr[k]> nowdata   ;k-- )
                {
                    arr[k+1]=arr[k];
                }
                arr[k+1]=nowdata;//赋值
    
            }
        }
        public static void main(String[] args) {
            //int array[] = {4,2,1,5};
            int[] array=new int[100_000];
            for(int i=0;i<array.length;i++){//随机产生数据
                array[i]=(int)(Math.random()*1000+1);
            }
            long startTime = System.currentTimeMillis();    //获取开始时间
            insertSort(array);
            long endTime = System.currentTimeMillis();    //获取结束时间
    
            System.out.println("程序运行时间:" + (endTime - startTime) + "ms");    //输出程序运行时间
    
        }

    看到了好几种写法,每种写法各有各的思路

    在放一种参考的

    public static void insertSort1(int[] nums)
        {
            int j;
            for(int i=1;i<nums.length;i++)
            {
                int temp = nums[i];
                for(j=i;j>0;j--)
                {
                    if(temp < nums[j-1])
                    {
                        nums[j] = nums[j-1]; //将所有在nums[i]之前的大于nums[i]的值都往后移一位
                    }
                    else break;
                }
                //移完所有大于nums[i]的值后,j刚好指向最靠前一个大于nums[i]的位置
                nums[j] = temp;
            }
            
        }

    总结:

    插入排序最多十万级的数据,最好的应用场景是边读边排,不适合数据量太大的,太大的还是用快排。

  • 相关阅读:
    实现一个简单的Http代理服务器
    微软的反向代理库YARP
    Elastic Search 基础——分析(Analysis)
    Elastic Seach基础—映射(Mapping)
    使用WebView2在.Net程序中集成Edge chromium
    Asp.net Core中实现自定义身份认证
    在Razor Pages的Url中增加扩展名后缀
    利用Aria2构造自己的下载工具(一)
    Mongodb中GUID的显示问题
    在Eclipse中使用MAT分析Android程序内存使用状况(转)
  • 原文地址:https://www.cnblogs.com/symkmk123/p/9453755.html
Copyright © 2011-2022 走看看