1 題目
功能:直接插入排序
描述:利用直接插入排序進行將數(shù)組序列從小到大排序
2 思路
原始順序: 34, 12, 45, 3, 8, 23, 89, 52, 24, 10
在代碼中將數(shù)組 a[0] 置為監(jiān)視哨
| 趟數(shù) | 監(jiān)視哨 | 排序結果 |
|---|---|---|
| 1 | 34 | (12,) 34, 45, 3, 8, 23, 89, 52, 24, 10 |
| 2 | 12 | (12, 34,) 45, 3, 8, 23, 89, 52, 24, 10 |
| 3 | 45 | (12, 34, 45,) 3, 8, 23, 89, 52, 24, 10 |
| 4 | 3 | (3, 12, 34, 45,) 8, 23, 89, 52, 24, 10 |
| 5 | 8 | (3, 8, 12, 34, 45,) 23, 89, 52, 24, 10 |
| 6 | 23 | (3, 8, 12, 23, 34, 45,) 89, 52, 24, 10 |
| 7 | 89 | (3, 8, 12, 23, 34, 45, 89,) 52, 24, 10 |
| 8 | 52 | (3, 8, 12, 23, 34, 45, 52, 89,) 24, 10 |
| 9 | 24 | (3, 8, 12, 23, 24, 34, 45, 52, 89,) 10 |
| 10 | 10 | (3, 8, 10, 12, 23, 24, 34, 45, 52, 89,) |
以上是整個的插入排序算法的過程
3 代碼
#include <stdio.h>
#include <stdlib.h>
/**
功能:直接插入排序
描述:利用直接插入排序進行將數(shù)組序列從小到大排序
**/
void insort(int s[], int n) { // 自定義函數(shù)isort
int i, j;
for (i = 2; i <= n; i++) { // 數(shù)組下標從2開始,0 位置做監(jiān)視哨,1位置一個數(shù)據(jù)無可比性
s[0] = s[i]; // 給監(jiān)視哨賦值
j = i - 1; // 確定要進行比較的元素的最右邊位置
while (s[0] < s[j]) {
s[j + 1] = s[j]; // 數(shù)據(jù)右移
j--; // 移向左邊一個未比較的數(shù)
}
s[j + 1] = s[0]; // 在確定的位置插入s[i]
}
}
int main(int argc, char const *argv[]) {
int a[11], i; // 定義數(shù)組及變量為基本整型
printf("請輸入10個數(shù)據(jù):\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]); // 接收從鍵盤中輸入的10個數(shù)據(jù)到數(shù)組a中
printf("原始順序:\n");
for (i = 1; i < 11; i++)
printf("%3d", a[i]); // 將未排序前的順序輸出
insort(a, 10); // 調用自定義函數(shù)isort()
printf("\n插入數(shù)據(jù)排序后順序:\n");
for (i = 1; i < 11; i++)
printf("%3d", a[i]); // 將排序后的數(shù)組輸出
printf("\n");
}
示例結果:
$ gcc ex058.c -o demo
$ ./demo
請輸入10個數(shù)據(jù):
34
12
45
3
8
23
89
52
24
10
原始順序:
34 12 45 3 8 23 89 52 24 10
插入數(shù)據(jù)排序后順序:
3 8 10 12 23 24 34 45 52 89