二分法插入排序(Binary Sort)

来源:互联网 发布:软件出售 编辑:程序博客网 时间:2024/06/07 07:25
 /**     * 3.2 二分法插入排序: 按二分法找到合适的位置,可以减少比较的次数.     *      * EX: int[] nums={8,1,4,2,23,10}; <     *      *                 8,1,4,2,23,10     *                   |     *                 1,8,4,2,23,10     *                     |     *                 1,4,8,2,23,10     *                       |     *                 1,2,4,8,23,10     *                         |     *                 1,2,4,8,23,10     *                            |     *                 1,2,4,8,10,23     *                      * 二分法插入排序是稳定的.     * 二分插入排序的比较次数与待排序记录的初始状态无关,仅依赖于记录的个数.     * 当n较大时,比直接插入排序的最大比较次数少得多,但大于直接插入排序的最小比较次数.     * 算法的移动次数与直接插入排序算法的相同,最坏的情况为n2/2,最好的情况为n.     * 平均时间复杂度为O(n2).     *      */    public static void binarySort(int[] nums) {        int half,insert;        for(int i=1;i<nums.length;i++){            half=i/2;            insert=nums[i];            if(nums[i]==nums[half]){                for(int j=i-1;j>half;j--){                    nums[j+1]=nums[j];                }                nums[half+1]=insert;            }else if(nums[i]<nums[half]){                for(int j=i-1;j>half;j--){                    nums[j+1]=nums[j];                }                for(int j=half;j>=0;j--){                    nums[j+1]=nums[j];                    if(j==0)                        nums[0]=insert;                    else if(insert>=nums[j-1]){                        nums[j]=insert;                        break;                    }                }            }else if((nums[i]>nums[half])&&(nums[i]<nums[i-1])){                    for(int j=i-1;j>=half+1;j--){                        nums[j+1]=nums[j];                        if(insert>=nums[j-1]){                            nums[j]=insert;                            break;                        }                    }            }        }    }
0 0
原创粉丝点击