Ⅰ )算法思想
从关于查找的讨论中可知,对有序表进行折半查找,其性能优于顺序查找。所以可以将折半查找思想用于在有序记录r[1, ...,i-1]中确定应插入的位置,相应的排序法称为折半插入排序法。折半插入排序是对直接插入排序算法的改进,在插入某记录时,采用折半查找的方法确定插入的位置。
Ⅱ)源代码
#include<stdio.h> #define MaxSize 50 typedef struct { int key; //记录关键字 }RecordType; //记录类型 void BinSort(RecordType r[],int length) //折半插入排序 { int low, high, mid; for (int i = 2; i <=length; i++) //i从2开始,假设i 前面为有序序列 { r[0] = r[i]; //将要插入的值赋给监视哨 low = 1; high = i - 1; while (low <= high) //确定插入位值 { mid = (low + high) / 2; if (r[0].key <r[mid].key) { high = mid - 1; //调整上界 } else { low = mid + 1; //调整下界 } } for (int j = i - 1; j >= low; j--) //j为要插入值的前一个下标 { r[j + 1] = r[j]; } r[low].key = r[0].key; } } int main() { RecordType a[] = { 0, 18, 12, 15, 25, 56, 30, 54, 45, 65, 55}; //待排序列 int length = sizeof(a) / sizeof(a[0]) - 1; BinSort(a, length); //调用函数 for (int i = 1; i <= length; i++) { printf("%d ", a[i].key); } printf("\n"); return 0; }
Ⅲ)性能分析
采用折半插入排序法,可减少关键字的比较次数。每插入一个元素,需要比较的次数最大为折半判定树的深度。虽然折半插入排序法与直接插入排序法相比较,改善了算法中比较次数的数量级为O(nlog2n),但其并未改变移动元素的时间耗费,所以折半插入排序总的时间复杂度仍然是O(n^2)。