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 }
运行结果:
浙公网安备 33010602011771号