#include <stdio.h> #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 #define LT(a, b) ((a)<(b) ? TRUE : FALSE) typedef int KeyType; typedef int OtherInfo; typedef struct { KeyType key; OtherInfo oinfo; } ElemType; typedef struct { ElemType elem[MAXSIZE+1]; int length; } SqList; /* 折半插入排序 Binary Insert Sort */ void BInsertSort(SqList *L) { int i, j, low, high, mid; for (i=2; i<=L->length; i++) { L->elem[0] = L->elem[i]; /* elem[0] 暂存器. */ low = 1; high = i-1; while (low<=high) { mid = (low+high)/2; if (LT(L->elem[0].key, L->elem[mid].key)) high = mid-1; else low = mid+1; /** 对于有EQ存在的情况可以进行证明得知, 和low划分到一起是为了得到high的值, 此时high指向与之相等的elem. * 对于无EQ存在的情况, high指向比key小的elem. * 两个极端是: * a. 比所有已知的elem都小, high指向0; * b. 比所有已知的elem都大, high指向最后一个elem. * */ } for (j=i-1; j