有一次看到人家的面试题,什么给定一个整型数组,让用二分法对数组进行排序。一开始直接蒙了,什么叫二分法排序?后来查了一下,就是插入排序前,对前面已经排好序的元素进行折半,以期比普通的插入排序更快速定位到要插入的位置。崩溃!!!
我们用下面的图简单演示一下:
【4】为待插入的关键字,前面的【1,3,5,6,7,8,9】是已经排好序的。
开始L=0指向A【0】=1,R=6指向A【6】=9,M=(L+R)/2=(0+6)/2=3指向A【3】=6;
下面就要开始移动R或L 来找到【4】要插入的位置:
A【M】=A【3】=6>4;所以插入位置在M的左边,移动R,R=M-1=3-1=2;就是说
R=2指向A【2】=5;
此时M=(R+L)/2=(2+0)/2=1,就是说:M=1指向A【1】=3;
因为A【M】=3 < 4,所以,插入位置应该在M右边,此时移动L,L=M+1=1+1=2;这个时候,L=2指向
A【2】=5;
到此我们可以看到,L和R都指向了A【2】,折半查找插入位置结束,【4】应该插入在元素【5】所在的位置,然后就和普通插入排序一样了,把【5】以及它以后的所有元素统一向后移动一个位置,插入【4】就可以了。
下面是一段简单的测试代码:
1 #include<stdio.h>
2