排序算法—— 直接插入排序二分插入排序

Posted Java联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法—— 直接插入排序二分插入排序相关的知识,希望对你有一定的参考价值。


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


伙伴们

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

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

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


插入排序


算法描述:

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<a.length-1;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<a.length-1;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;
   }
 }


小伙伴们

今天的算法记住了吗?


【排序算法】(2)—— 直接插入排序、二分插入排序

或者我们可以叫它

打牌算法哦~

嘿嘿~



【排序算法】(2)—— 直接插入排序、二分插入排序

我是萌新娜娜

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

学习Java的路上请多多指教


【排序算法】(2)—— 直接插入排序、二分插入排序


    


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

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

以上是关于排序算法—— 直接插入排序二分插入排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:二分插入排序

排序算法-直接插入排序

排序算法之二分法(折半)插入排序算法

几种常见的排序算法分析学习

[golang] 数据结构-二分插入排序

常见的排序算法 插入排序