利用二分法实现插入排序算法(二分法使用递归来实现)

编程爱好者联盟 2016-09-15

; ; ;最近在看《算法导论》这本书,在练习题当中发现了这样的一个问题:使用二分查找法来实现插入排序,由于之前的内容当中有讲解二分法的递归实现,所以在这便将它们结合起来希望解决这个问题。闲话不多说了,直接上代码:

; ;<pre>// ;Algrithms.cpp ;: ;定义控制台应用程序的入口点。

//

//使用二分法来完成插入排序,并且使用递归算法来完成二分法

#include ;"stdafx.h"

int ;Binary_Divide(int ;A[], ;int ;low, ;int ;height, ;int ;key){

; ; ; ;//递归终止的条件为输入的low&gt;输入的height,这时所寻找到的位置为low的左边或者右边

; ; ; ;//这时只需要判断key和A[low]之间的大小就可以判断出key所应该放置的位置

; ; ; ;if ;(low ;&gt; ;height)

; ; ; ;{

; ; ; ; ; ; ; ;if ;(key ;&gt; ;A[low])

; ; ; ; ; ; ; ;{

; ; ; ; ; ; ; ; ; ; ; ;return ;low ;+ ;1;//如果key比A[low]大,那么key就放置在A[low]的下一个位置上面

; ; ; ; ; ; ; ;}

; ; ; ; ; ; ; ;else{

; ; ; ; ; ; ; ; ; ; ; ;return ;low;//如果key比A[low]小,那么key就放置在A[low]的位置上面(因为之后的程序会将这个位置空出来)

; ; ; ; ; ; ; ;}

; ; ; ;}

; ; ; ;if ;(A[(low ;+ ;height) ;/ ;2] ;&gt; ;key)

; ; ; ;{

; ; ; ; ; ; ; ;Binary_Divide(A, ;low, ;(low ;+ ;height) ;/ ;2 ;- ;1, ;key);

; ; ; ;}else

; ; ; ;{

; ; ; ; ; ; ; ;Binary_Divide(A, ;(low ;+ ;height) ;/ ;2 ;+ ;1, ;height, ;key);

; ; ; ;}

}

int ;_tmain(int ;argc, ;_TCHAR* ;argv[])

{

; ; ; ;int ;a[11] ;= ;{ ;6, ;10, ;13, ;3, ;7, ;20, ;24, ;100, ;1, ;3, ;6 ;};//被排序的数组

; ; ; ;int ;array_length ;= ;sizeof(a) ;/ ;sizeof(a[0]);//数组大小

; ; ; ;int ;key;//关键字

; ; ; ;//将A[n]插入到已经排好序的前n-1个数当中

; ; ; ;for ;(int ;i ;= ;1; ;i ;&lt; ;array_length; ;i++)

; ; ; ;{

; ; ; ; ; ; ; ;key ;= ;a[i];

; ; ; ; ; ; ; ;int ;j ;= ;i ;- ;1;

; ; ; ; ; ; ; ;int ;position ;= ;Binary_Divide(a, ;0, ;j, ;key);//二分法寻找key所应该处的位置

; ; ; ; ; ; ; ;//将position(包括position)之后直到j的数往后挪动一个位置

; ; ; ; ; ; ; ;while ;(j ;&gt;= ;0 ;&amp;&amp; ;j&gt;=position)

; ; ; ; ; ; ; ;{

; ; ; ; ; ; ; ; ; ; ; ;if ;(a[j]&gt;key)

; ; ; ; ; ; ; ; ; ; ; ;{

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

; ; ; ; ; ; ; ; ; ; ; ;}

; ; ; ; ; ; ; ; ; ; ; ;j--;

; ; ; ; ; ; ; ;}

; ; ; ; ; ; ; ;a[position] ;= ;key;//将关键字放置在正确的位置上面

; ; ; ; ; ; ; ;//每排列好一个元素的位置就将数组打印出来

; ; ; ; ; ; ; ;for ;(int ;k ;= ;0; ;k ;&lt; ;array_length; ;k++)

; ; ; ; ; ; ; ;{

; ; ; ; ; ; ; ; ; ; ; ;printf("%d ;", ;a[k]);

; ; ; ; ; ; ; ;}

; ; ; ; ; ; ; ;printf("%d\n",position);//打印所找到的合适位置

; ; ; ;}

; ; ; ;getchar();

; ; ; ;return ;0;

}</pre> ; ;

; ;算法思路很简单,无非是将原来的线性查找被排序元素的合适的位置的部分换成了使用二分法来查找合适的位置,之前困扰我很久的是递归终止情况的判断。在学习二分查找的时候,我们知道,如果一个数不存在于一个数组当中的话,二分法会因为所输入的数组下界大于上界而终止递归,而在本算法查找位置的时候,二分法的这种递归终止的性质会导致我们找到一个距离”适合位置最近的点,所以这个点和关键字之间大小的判断就可以传输回正确的位置了。

菜鸟一枚,第一次发博客,还请园里面的大神们多多指教。

相关推荐