C语言直接插入排序算法介绍及示例

 更新时间:2022年08月11日 16:56:32   作者:柒号华仔  
插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小

1. 直接插入排序介绍

1.1 定义

直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。

1.2 基本原理

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

下面的动图非常清晰的诠释了直接插入排序的过程:

1.3 时间复杂度

时间复杂度

最好的情况是数组所有元素已经是有序排列,在排序时待排元素只需与前一元素比较,不用继续往前搜索比较,时间复杂度为O(n);

最差的情况是数组所有元素全部反序,在排序时待排元素需要与前面所有有序元素进行比较,比较次数为:

1+2+…+(n-1) = n(n-1)/2

每次前面的有序元素均要往后移动,移动次数为:

(1+2)+(2+2)+…+(n-1+2) =(n-1)(n+4)/2

综上所述,直接插入排序的平均时间复杂度为O( n 2 n^2 n2) 。

1.4 空间复杂度

直接插入排序为平行移动,因此空间复杂度为:O(1) 。

1.5 优缺点

优点:直接插入排序算法简单,当待排序记录数量n很小时,局部有序时,较为适用。

缺点:当数据量庞大并且乱序严重时,比较和移动次数多,排序效率低。

2. 代码实现

2.1 代码设计

a. 实现直接插入排序需要设计两层循环,整个数组为外循环,已经排列好的有序元素为内循环;

b. 从外循环取出待排元素array[i],使用临时变量temp存储其值;

c. 将待排元素与内循环的有序元素依次(从后往前)进行比较,若有序元素比待排元素大,则向后移动一位;

d. 直至有序元素比待排元素小,则不再移动,将temp赋值给array[j+1]。

2.2 代码实现

#include <stdio.h>
void printArray(int array[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}
void insertSort(int array[], int size) {
    int temp,i,j;
    for (i = 1; i < size; i++) {
        temp = array[i];
        j = i-1;
        while (j >= 0 && array[j] > temp) {
            array[j+1] = array[j];
            j--;
        }
        array[j+1] = temp;
        printArray(array, size);
    }
}
int main() {
    int array[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
    printArray(array, sizeof(array)/sizeof(int));
    insertSort(array, sizeof(array)/sizeof(int));
    return 0;
}

运行结果:

3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
3 38 44 5 47 15 36 26 27 2 46 4 19 50 48
3 5 38 44 47 15 36 26 27 2 46 4 19 50 48
3 5 38 44 47 15 36 26 27 2 46 4 19 50 48
3 5 15 38 44 47 36 26 27 2 46 4 19 50 48
3 5 15 36 38 44 47 26 27 2 46 4 19 50 48
3 5 15 26 36 38 44 47 27 2 46 4 19 50 48
3 5 15 26 27 36 38 44 47 2 46 4 19 50 48
2 3 5 15 26 27 36 38 44 47 46 4 19 50 48
2 3 5 15 26 27 36 38 44 46 47 4 19 50 48
2 3 4 5 15 26 27 36 38 44 46 47 19 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

到此这篇关于C语言直接插入排序算法介绍及示例的文章就介绍到这了,更多相关C语言直接插入排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C指针原理教程之垃圾回收-内存泄露

    C指针原理教程之垃圾回收-内存泄露

    C语言没有运行时库,无法自动压缩使用中的内存,缩小堆栈所需内存空间。若只申请内存,没有释放,势必造成系统内存不断减少、丢失。长时间的运行,最终导致系统死机。文章阐述了C语言垃圾产生的原因,并从引用计数、标记一清除算法两方面提出如何实现C语言的垃圾回收。
    2019-02-02
  • C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++实现Huffman的编解码

    C++实现Huffman的编解码

    这篇文章主要为大家详细介绍了C++实现Huffman的编解码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++实现的泛型List类分享

    C++实现的泛型List类分享

    这篇文章主要介绍了C++实现的泛型List类分享,参考C#的List功能实现,需要的朋友可以参考下
    2014-07-07
  • 详解c++种gmock单元测试框架

    详解c++种gmock单元测试框架

    这篇文章我们给大家分享了关于c++种gmock单元测试框架的相关知识点内容,有兴趣的朋友们学习下。
    2018-08-08
  • C语言*与&在操作线性表的作用详解

    C语言*与&在操作线性表的作用详解

    本文主要介绍了C语言*与&在操作线性表的作用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • VScode配置C++运行环境的完整步骤

    VScode配置C++运行环境的完整步骤

    这篇文章主要给大家介绍了关于VScode配置C++运行环境的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Objective-C的内省(Introspection)用法小结

    Objective-C的内省(Introspection)用法小结

    这篇文章主要介绍了Objective-C的内省(Introspection)用法,这是面向对象语言和环境的一个强大特性,需要的朋友可以参考下
    2014-07-07
  • vs2019配置C++版OpenCV的方法步骤

    vs2019配置C++版OpenCV的方法步骤

    最近要用到很多OpenCV的库,所以开始学了点OpenCV,本文记录VS和OpenCV的安装、配置过程。具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • 基于OpenCV实现图像分割

    基于OpenCV实现图像分割

    这篇文章主要为大家详细介绍了基于OpenCV实现图像分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论