排序算法之--插入排序

基本思想:

看图 ,觉得网上这张图特别形象。就是从牌堆里抓牌,比如先抓个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;
        }
        
    }

总结:

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

posted @ 2018-08-10 10:59  symkmk123  阅读(103)  评论(0编辑  收藏  举报