- Insertion Sort: ref.1 | recursion version
- ShellSort: ref.1
1 | //insertion sorting has 4 main different methods, including: |
Appendix: 2way_insertion_sorting1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
int main()
{
int n = 8;
int num[8] = { 49,38,65,97,76,13,27,49 }; // 待排序数组
int temp[8] = { 0 }; // 辅助数组
int final_num = 0; // 尾指针(非真实指针,只代表数组下标)
int first_num = 0; // 头指针(同上,且开始均指向0)
temp[0] = num[0]; // 先确定第一个位置,并以此为判断依据
for (int i = 1; i < n; ++i) // 从第二个数开始插入排序
{
if (temp[final_num] < num[i]) // 如果待插数字比尾部数字还大,则插在尾部
// 数字后面,并把尾部指针向后移动一位
{
final_num = (final_num + 1 + n) % n;
temp[final_num] = num[i];
}
else if (temp[first_num] > num[i]) // 如果待插数字比头部数字还小,则插在头部
// 数字后面,并把头部指针向前移动一位
{
first_num = (first_num - 1 + n) % n;
temp[first_num] = num[i];
}
else if (temp[0] <= num[i]) // 如果比头部数字大,比尾部数字小
// 则比较该数字是否比辅助数组的第一个数大
// 如果大的话,从final_num往前找,找到
// 位置后插进去,否则与上述步骤相反
{
int k = (final_num + 1 + n) % n;
while (temp[((k - 1) + n) % n] > num[i])
{
temp[(k + n) % n] = temp[(k - 1 + n) % n];
k = (k - 1 + n) % n;
}
temp[(k + n) % n] = num[i];
final_num = (final_num + 1 + n) % n;
}
else
{
int k = (first_num - 1 + n) % n;
while (temp[((k + 1) + n) % n] < num[i])
{
temp[(k + n) % n] = temp[(k + 1 + n) % n];
k = (k + 1 + n) % n;
}
temp[(k + n) % n] = num[i];
first_num = (first_num - 1 + n) % n;
}
for (int i = 0; i < n; ++i) // 每次排序都输出辅助数组序列
{
printf("%d\t", temp[i]);
}
printf("\n");
printf("first=%d final=%d\n", first_num, final_num);
}
for (int i = 0; i < n; ++i) // 根据辅助数组确定新序列
{
num[i] = temp[(first_num + i) % n];
printf("%d\t", num[i]);
}
return 0;
}