约定:
- 假设数据中有n个数据元素(关键字)。排列算法中,将序列中各关键字值依次存放于类型为keytype的数组元素K[1], K[2], K[3], …, K[n]中。
- 排序结果按照数据元素(关键字)值的大小,从小到大排序。
插入排序法
核心思想:第 i 趟排序将序列中第 i+1 个元素 ki+1 ( i = 1, 2, …, n-1 ) 插入到一个已经按值有序的子序列 ( k’1, k’2, k’3, …, k’i ) 的合适位置,得到一个长度为 i+1 且仍然保持按值有序的子序列 ( k’‘1, k’‘2, k’‘3, …, k’‘i, k’'i+1 )。
/**
插入排序法从小到大排序
*/
void INSERTSORT(keytype K[], int n)
{
int i, j;
keytype temp;
for (i=2; i<=n; i++) {
temp = K[i];
j = i-1;
while (j>0 && temp<K[j])
K[j+1] = K[j--];
K[j+1] = temp;
}
}
折半插入排序法
折半插入排序法事实上是将折半查找法和插入排序法结合在一起。故这里我们先介绍折半查找法。
折半查找法
折半查找法也可称为二分查找法,是在排序连续顺序文件中将要查找的关键字值与当前查找范围内位置居中的记录的关键字的值进行比较。
若匹配,则查找成功,给出被查到的记录在文件中的位置,查找结束。
若要查找的关键字值小于位置居中的记录的关键字值,则到当前查找范围的前半部分重复上述查找过程,否则,到当前查找范围的后半部分重复上述查找过程,直到查找成功或失败。若查找失败,则给出信息0。
注:折半查找法只能用于排序连续顺序文件!
变量
变量 | 含义 |
---|---|
n | 排序连续顺序文件中记录的个数 |
low | 当前查找范围内第一个记录在文中的位置 ,初值 low=1 |
high | 当前查找范围内最后那个记录在文件中的位置, 初值 high=n |
mid | 当前查找范围内位置居中的那个记录在文件中的位置 |
折半查找法非递归算法
int BIN_SEARCH(keytype key[], int n, keytype k)
{
int low = 1, high = n, mid;
while (low <= high) {
mid = (low + high) / 2;
if (key[mid] == k)
return mid; // 查找成功
if (k > key[mid])
low = mid + 1; // 查找范围缩小到后半部分
else
high = mid - 1; // 查找范围搜小到前半部分
}
return 0; // 查找失败
}
折半查找法递归算法
int RECUR_BIN_SEARCH(keytype key[], int low, int high, keytype k)
{
int mid;
if (low > high)
return 0;
else {
mid = (low + high) / 2;
if (key[mid] == k)
return mid;
if (k > key[mid])
return RECUR_BIN_SEARCH(key, mid+1, high, k);
else
return RECUR_BIN_SEARCH(key, low, mid-1, k);
}
}
折半插入排序法
void BIN_INSERTSORT(keytype K[], int n)
{
int i, j, low, high, mid;
keytype temp;
for(i=2; i<=n; i++) {
temp = K[i];
low = 1;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (temp < key[mid])
high = mid - 1;
else
low = mid + 1;
} // 采用折半查找方法确定K[i]的合适位置
for (j=i-1; j>=low; j--)
K[j+1] = K[j]; // 有关元素依次后移一个位置
K[low] = temp; // 插入K[i],至此一趟结束
}
}