利用直接插入排序进行将数组序列从小到大排序

管理员

1 题目

功能:直接插入排序
描述:利用直接插入排序进行将数组序列从小到大排序

2 思路

原始顺序: 34, 12, 45, 3, 8, 23, 89, 52, 24, 10

在代码中将数组 a[0] 置为监视哨

趟数 监视哨 排序结果
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>

/**
功能:直接插入排序
描述:利用直接插入排序进行将数组序列从小到大排序
**/

void insort(int s[], int n)	{					// 自定义函数isort

    int i, j;
    for (i = 2; i <= n; i++) {					// 数组下标从2开始,0 位置做监视哨,1位置一个数据无可比性
        s[0] = s[i];							// 给监视哨赋值
        j = i - 1;								// 确定要进行比较的元素的最右边位置
        while (s[0] < s[j]) {
            s[j + 1] = s[j];					// 数据右移
            j--;								// 移向左边一个未比较的数
        }
        s[j + 1] = s[0];						// 在确定的位置插入s[i]
    }
}

int main(int argc, char const *argv[]) { 
    int a[11], i;									// 定义数组及变量为基本整型
    printf("请输入10个数据:n");
    for (i = 1; i <= 10; i++)
        scanf("%d", &a[i]);							// 接收从键盘中输入的10个数据到数组a中
    printf("原始顺序:n");
    for (i = 1; i < 11; i++)
        printf("%3d", a[i]);						// 将未排序前的顺序输出
    insort(a, 10);									// 调用自定义函数isort()
    printf("n插入数据排序后顺序:n");
    for (i = 1; i < 11; i++)
        printf("%3d", a[i]);						// 将排序后的数组输出
    printf("n");
}

示例结果:

$ gcc ex058.c -o demo
$ ./demo
请输入10个数据:
34
12
45
3
8
23
89
52
24
10
原始顺序:
 34 12 45  3  8 23 89 52 24 10
插入数据排序后顺序:
  3  8 10 12 23 24 34 45 52 89