/**
* 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;
}
}
}
}
}
二分法插入排序(Binary Sort)
最新推荐文章于 2021-11-09 19:48:55 发布