我是靠谱客的博主 欣喜可乐,最近开发中收集的这篇文章主要介绍插入排序加二分排序详细讲解(附代码),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

插入排序:从字义上理解,这是一组不断进行插入的排序,正确! 插入排序其实就是一个插入+顺序部分排序的过程。下面举个例子给讲解一下(从小到大排序)

一个数组:int a[]={1,3,2,7,5,4,8} 是长度为7的数组, 在进行插入排序的过程中呢我们需要循环6次

默认:已排序数组{1}    未排序数组{3,2,7,5,4,8,}

第一次循环:插入a[1]  a[1]>a[0] 已排序数组 {1,3} 未排序数组{2,7,5,4,8}

第二次循环:插入a{2} a[2]<a[1] 向已排序数组中挪到a[1]位置和原a[1]位置交换,再和a[0]比较 a[1]>a[0],位置保持

                       已排序数组{1,2,3} 未排序数组{7,5,4,8}

以此类推。最后得出有序数组,下面附核心代码


    public static void insertSort(int a[])
    {
        for (int i = 1; i < a.length; i++)
        {
            if (a[i]<a[i-1])
            {
                int temp=a[i];
                int j=i;
                while (j-1>0&&a[j-1]>temp)
                {
                    a[j]=a[j-1];
                    j--;
                }
                //while循环结束后,现在的J位置就是当前插入数字该待的地方!
                a[j]=temp;
            }
        }
    }

从上面得出,如果是一个完全有序的再进行排序,那么时间复杂度最佳:为O(N) ,最糟糕的是完全乱序,那么时间复杂度为 O(N^2);


二分排序:思想上和插入排序差不多,加入了二分的思想。在前面已排序的数组中找中间数进行对比。下面附核心代码

    public static void halfSort(int a[])
    {
        int start;
        int end;
        int temp=0;
        int mid,j;
        
        for(int i=1;i<a.length;i++)
        {
            start=0;
            end=i-1;
            temp=a[i];

            while(start<=end)
            {
                mid=(start+end)/2;
                if (temp<a[mid])
                {
                    end=mid-1;
                }
                else 
                {
                    start=mid+1;
                }
            }
            
            //while循环完后,start=end+1,此时start为当前插入数字所待坑位!
            //把坑位给当前插入的数据挪出来
            for( j = i-1;j >= start;j-- )
            {
                a[j+1] = a[j];
            }
            //将当前插入数字挪入它该待的坑位
            a[start] = temp;
        }
    }

时间复杂度: O(n*log 2 n) 毕竟二分




最后

以上就是欣喜可乐为你收集整理的插入排序加二分排序详细讲解(附代码)的全部内容,希望文章能够帮你解决插入排序加二分排序详细讲解(附代码)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部