插入排序(直接插入排序和折半查找插入排序)
#include <stdio.h>
// 直接插入排序
void insert_sort(int sz[], int len)
{
for (int i = 2; i < len + 1; i++)
{
// 位置0作为哨兵
sz[0] = sz[i];
int j;
// 寻找该插入的位置
for (j = i - 1; sz[j] > sz[0]; j--)
{
sz[j + 1] = sz[j];
}
sz[j + 1] = sz[0];
}
}
// 折半查找插入排序
void half_insert_sort(int sz[], int len)
{
for (int i = 2; i < len + 1; i++)
{
// 位置0作为哨兵
sz[0] = sz[i];
// 折半查找该插入的位置
int low = 1, high = i - 1;
while (low <= high)
{
int mid = (low + high) >> 1;
if (sz[0] < sz[mid])
high = mid - 1;
else
low = mid + 1;
}
for (int j = i - 1; j >= high + 1; j--)
sz[j + 1] = sz[j];
sz[high + 1] = sz[0];
}
}
int main()
{
// 0位置未用作为哨兵,待排序数组
int a[] = {0, 5, 10, 8, 100, 50, -10, 60};
insert_sort(a, 7); // 7为数组实际长度
//half_insert_sort(a, 7);
// 输出排序结果
for (int i = 1; i < 8; i++)
{
printf("%d%c", a[i], i == 7 ? '\n' : ' ');
}
return 0;
}
更多精彩

