直接插入排序

直接插入排序:将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增1的有序表。

直接插入排序的平均时间复杂度为O(n^2)。

// 直接插入排序
#include <stdio.h>

#define N 10 // 数组最大值

// 顺序表结构
typedef struct {
    int value[N + 1]; // 顺序表中的值
    int length; // 顺序表长度
} SqList;

/**
 * 初始化顺序表
 * @param L 顺序表
 * @param d 存初始值的数组
 */
void InitSqList(SqList *L, int *d) {
    int i;

    for (i = 0; i < N; ++i) {
        L->value[i + 1] = d[i];
    }
    L->length = N;
}

/**
 * 遍历顺序表中元素的值
 * @param L 顺序表元素
 */
void Print(SqList L) {
    int i;

    printf("顺序表中的值为:");
    for (i = 1; i < L.length; i++) {
        printf("%d, ", L.value[i]);
    }
    printf("%d", L.value[i]);
    printf("\n");
}

/**
 * 直接插入排序
 * @param L 顺序表
 */
void InsertSort(SqList *L) {
    int i, j;

    for (i = 2; i <= L->length; i++) {
        // 后面的元素比前面元素小,需将L->value[i]插入有序子表
        if (L->value[i] < L->value[i - 1]) {
            L->value[0] = L->value[i]; // 设置哨兵

            // 将有序子表中,比哨兵位置元素大的元素都向后移动一个位置
            for (j = i - 1; L->value[j] > L->value[0]; j--) {
                L->value[j + 1] = L->value[j];
            }
            // 将哨兵位置的元素插入正确的位置
            L->value[j + 1] = L->value[0];
        }
    }
}

int main() {
    int d[N] = {50, 10, 90, 30, 70, 40, 80, 60, 20, 102}; // 存初始值的数组
    SqList L; // 顺序表

    InitSqList(&L, d); // 初始化顺序表
    printf("刚进行初始化后");
    Print(L); // 遍历顺序表

    InsertSort(&L); // 对顺序表进行直接插入排序
    printf("直接插入排序后");
    Print(L); // 遍历顺序表

    return 0;
}
运行结果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 直接插入排序 原理:每次将排序中的元素,插入到前面已经排好序的有序序列中去,直到排序完成。 步骤: 第一步,a[0...
    Swen_9826阅读 33,077评论 0 8
  • 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新的记录数增1的有序表。即:先将序列的第1个记录看成是...
    NEXTFIND阅读 4,200评论 0 1
  • 基本思想 将一个记录插入到已排序好的有序表中,从而得到一个新记录数增1的有序表。即:先将序列的第1个记录看成是一个...
    水欣阅读 1,553评论 0 0
  • 记忆里,从未如此反感这个字 临近年关,身边的人们都陷入忙碌之中,打年货搞卫生,张罗着一切跟年有关的事情,川流不息的...
    山猫白鹇阅读 819评论 1 1
  • 人生有很多时刻都不适合展开来讲,因为你要的不是有个人听你过去的故事,而是懂你此刻的心情,沉默吧,如果那个时候有人能...
    橘_Jane阅读 962评论 0 0