1 #include <stdio.h> 2 3 // 直接插入排序 4 void insert_sort(int sz[], int len) 5 { 6 for (int i = 2; i < len + 1; i++) 7 { 8 // 位置0作为哨兵 9 sz[0] = sz[i]; 10 int j; 11 // 寻找该插入的位置 12 for (j = i - 1; sz[j] > sz[0]; j--) 13 { 14 sz[j + 1] = sz[j]; 15 } 16 sz[j + 1] = sz[0]; 17 } 18 } 19 // 折半查找插入排序 20 void half_insert_sort(int sz[], int len) 21 { 22 for (int i = 2; i < len + 1; i++) 23 { 24 // 位置0作为哨兵 25 sz[0] = sz[i]; 26 // 折半查找该插入的位置 27 int low = 1, high = i - 1; 28 while (low <= high) 29 { 30 int mid = (low + high) >> 1; 31 if (sz[0] < sz[mid]) 32 high = mid - 1; 33 else 34 low = mid + 1; 35 } 36 for (int j = i - 1; j >= high + 1; j--) 37 sz[j + 1] = sz[j]; 38 sz[high + 1] = sz[0]; 39 } 40 } 41 42 int main() 43 { 44 // 0位置未用作为哨兵,待排序数组 45 int a[] = {0, 5, 10, 8, 100, 50, -10, 60}; 46 insert_sort(a, 7); // 7为数组实际长度 47 //half_insert_sort(a, 7); 48 // 输出排序结果 49 for (int i = 1; i < 8; i++) 50 { 51 printf("%d%c", a[i], i == 8 ? '\n' : ' '); 52 } 53 return 0; 54 }
#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 ==
8 ?
'
\n
' :
' ');
}
return
0;
}