注:排序这一章也全是重点。
 折半插入排序,希尔排序,冒泡排序,快排,堆排序,这些排序非常重要。一定要掌握
第八章 排序
 8.1 插入排序
 直接插入排序
void InsertSort(ElemType A[], int n) {
 //直接插入排序
 int i, j;
 for (i = 2; i <= n; i++) //依次将A[2]~A[n]插入到前面已排好的序列
 if (A[i].key < A[i - 1].key) { //若A[i]的关键码小于其前驱,需将A[i]插入有序表
 A[0] = A[i]; //复制为哨兵,A[0]不存放元素
 for (j = i - 1; A[0].key < A[j].key; --j) //从后往前查找待插入位置
 A[j+1] = A[j]; //向后挪位
 A[j + 1] = A[0]; //复制到插入位置
 }
 }
折半插入排序
 void InsertSort(ElemType A[], int n) {
 //折半插入排序
 int i, j, low, high, mid;
 for (i = 2; i <= n; i++) { //依次将A[2]~A[n]插入到前面已排序序列
 A[0] = A[i]; //将A[i]暂存到A[0]
 low = 1; high = i - 1; //设置折半查找的范围
 while (low <= high) { //折半查找(默认递增有序)
 mid = (low + high) / 2; //取中间点
 if (A[mid].key > A[0].key) high = mid - 1; //查找左子表
 else low = mid + 1; //查找右子表
 }
 for (j = i - 1; j >= high + 1; --j)
 A[j + 1] = A[j]; //统一后移元素,空出插入位置
 A[high + 1] = A[0]; //插入操作
 }
 }










