002折半插入排序

折半插入排序 - Binary Insert Sort

 折半插入排序是对直接插入排序的改进。由于查找A[i]的插入位置时是在有序表中进行查找,因此可以采用折半查找,从而减少比较次数,但是对应的移动次数却没有发生改变。算法的主要区别在于寻找插入位置的方法。

 在直接插入排序中,寻找插入位置是遍历查找,而在折半插入排序中,采用的是折半查找:首先定义有序表的低位A[low]和高位A[high],在比较时 是将temp与A[middle](mid = (high+low/2))进行比较,这也是折半查找名字的由来。如果A[middle] > temp 待排序元素,则插入位置位于A[low]和A[middle]之间,否则位于A[middle]和A[high]之间。然后通过不断的"折半",最终确定 最后插入的位置。

    

  源代码:

 1 #include <stdio.h>
 2 #define Length 10
 3 
 4 void printArray(int A[], int len)
 5 {
 6     int i;
 7 
 8     for(i = 0; i < len - 1; i++)
 9     {
10         if(i < len -1)  printf("%d ", A[i]);
11     }
12 
13     printf("%d\n", A[i]);
14 }
15 
16 void binaryInsertSort(int A[], int len)
17 {
18     int i,j;
19     int temp;
20 
21     int low, middle, high;
22 
23     for(i = 1; i < len; i++)
24     {
25         temp = A[i];
26 
27         //寻找插入位置
28         low  = 0;
29         high = i - 1;
30 
31         while(low <= high)
32         {
33             middle = (low + high) / 2;
34 
35             if( A[middle] > temp )
36             {
37                 high = middle - 1;  //插入点位于低位区
38             }
39             else
40             {
41                 low = middle + 1;   //插入点位于高位区
42             }
43         }
44 
45         //将数据整体后移,腾出插入位置
46         for(j = i - 1; j > high; j--)
47         {
48             A[j+1] = A[j];
49         }
50     
51         A[high+1] = temp;
52     }
53 }
54 
55 int main()
56 {
57     int A[Length] = {9,8,7,6,5,4,3,2,1,0};
58 
59     printf("The data before Binary Insert Sort is:\n");
60     printArray(A, Length);
61     
62     binaryInsertSort(A, Length);
63 
64     printf("\nThe data after Binary Insert Sort is:\n");
65     printArray(A, Length);
66     return 0;
67 }

  运行结果:

     

 

posted @ 2013-04-25 18:57  littleCat  阅读(174)  评论(0)    收藏  举报