java二分排序的思想,【排序算法】(2)—— 直接插入排序、二分插入排序

温馨提示:文章干货,建议收藏后阅读!

伙伴们

上次分享的排序算法怎么样~

是不是比作题有意思多了~

今天我们再来分享两种算法

插入排序

算法描述:

1)数据存放在数组R[0….n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0…i-1]和R[i….n-1],其中:前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分。

2)将当前无序区的第1个记录R[i]插入到有序区R[0….i-1]中适当的位置,使R[0…i]变为新的有序区

3)当插入第i(i≥1)个对象时, 前面的r[0], r[1], …, r[i-1]已经排好序。

举个通俗一点的例子,我们打牌(扑克牌、麻将都是呀)的时候。用的插入排序呀~想象一下~怎么样这是不是比较容易理解什么是插入排序了~嘿嘿~

算法代码:

//插入排序private static void insertSort(int[] a){

for(int i=0;i

int temp = a[i+1];

int j=i;

while(a[j]>temp) {

a[j+1]=a[j];

j--;

if (j<0) {

break;

}

}

a[j+1]=temp;

}

}

算法分析:

关键字比较次数和记录移动次数与记录关键字的初始排列有关。

最好情况下, 排序前记录已按关键字从小到大有序, 每趟只需与前面有序记录序列的最后一个记录比较1次, 移动2次记录, 总的关键字比较次数为 n-1, 记录移动次数为 2(n-1)。在平均情况下的关键字比较次数和记录移动次数约为n² /4。

直接插入排序是一种稳定的排序方法,最大的优点是简单,在记录数较少时,是比较好的办法。

二分插入排序(直接插入排序的优化)

算法描述:

在直接插入排序的基础上,利用二分(折半)查找算法决策出当前元素所要插入的位置。

二分查找:

找到中间元素,如果中间元素比当前元素大,则当前元素要插入到中间元素的左侧;否则,中间元素比当前元素小,则当前元素要插入到中间元素的右侧。

找到当前元素的插入位置 i 之后,把 i 和 high 之间的元素从后往前依次后移一个位置,然后再把当前元素放入位置 i。

//二分插入排序

private static void insertSort2(int[] a){

for(int i=0;i

int temp = a[i+1];

int low = 0;

int high = i;

int mid;

while(low<=high) {

mid = (low+high)/2;

if (a[mid]>temp) {

high = mid-1;

}else{

low = mid+1;

}

}

for(int j=i;j>=high+1;j--){

a[j+1]=a[j];

}

a[high+1]=temp;

}

}

小伙伴们

今天的算法记住了吗?

d3d28d11b75aef3ee2160d3dccd71844.png

或者我们可以叫它

打牌算法哦~

嘿嘿~

a59421eaed7951977d4aa3331e97e8ca.png

我是萌新娜娜

立志做一个不翻车的老司机

学习Java的路上请多多指教

2e3c00cf2d06d2bf20d1ffe832b5080b.png

有任何问题都可以在文章留言,娜姐都看着的呢!

合作,投稿,转载,版权问题请联系 李娜:Lina_Java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值