插入排序是稳定排序,时间复杂度最低为O(n),最高为O(n^2),平均为O(n^2)。

插入排序是将数组分为两部分,一部分已经排好序,另一部分未排好序,每次从未排好序的部分取第一个元素插入到已经排好序的部分正确的位置,如此循环n-1次。

就好像你手里有十张牌,左手有一张,右手有九张。每次从右手的牌中取最左边的一张插入到左手的牌里,右手的牌插完了,排序也完成了。

编写代码要点:

  1. 时间复杂度是O(n^2),意味着有双重循环。外面大循环代表插入的轮次,因为一开始左手有一张牌,所以只需要插入n-1次即可,也就是每次插入都从左手牌末尾元素的下标+1开始。
  2. 内层循环是从后方前反向遍历,因为要插入到正确的位置,需要给这个待插入的元素挪一个位置,所以在待插入的位置后面的所有元素都要整体后移一个位置,覆盖掉待插入元素初始的位置,然后把待插入的元素放置在空出来的位置即可。因为在元素整体后移给待插入元素挪位置的时候会覆盖掉待插入元素原本的位置,所以需要用一个元素来保存待插入的元素。

插入排序代码如下:

#include <stdio.h>

void insertSort(int arr[], int n) {
int i, j;
int currentElement;
// 前i个元素有序,初始情况只有一个有序组,也就是数组的第一个元素,故i=1
for (i = ; i < n; ++i) {
currentElement = arr[i]; // 保存当前要插入的元素,因为之后移动数组元素的时候会覆盖掉当前的元素
// 从后向前遍历,找到插入位置,也就是最后一个比待插入的元素小的元素
// 从待插入的前一个元素开始遍历,所以j=i-1,遍历到末尾,也就是数组开头,i=0
for (j = i - ; j >= ; --j) {
if (arr[j] > currentElement) {
arr[j + ] = arr[j];
} else {
break; // 找到了插入元素的位置,结束循环
}
}
// 此时arr[j]是<currentElement的,它并没有被移动,也没有留出空缺,空缺在它身后
// 故把currentElement赋值给arr[j]身后的空缺,也就是arr[j+1]
arr[j + ] = currentElement;
}
} int main() {
int i = ;
int arr[] = {, , , , , , , , , };
insertSort(arr, );
for (i = ; i < ; ++i) {
printf("%d ", arr[i]);
}
return ;
}

插入排序,C语言实现的更多相关文章

  1. 插入排序_C语言_数组

    插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...

  2. 插入排序——C语言

    插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.  (每步将一个待 ...

  3. 插入排序C语言版本

    算法思路:        每趟将一个待排序的元素作为关键字,按照其关键字值的大小插入到已经排好的部分的适当位置上,直到插入完成.        数组中待排序的关键字前面的数据为已经排序的数据,关键字插 ...

  4. 希尔排序——C语言

    希尔排序 希尔排序是插入排序的一种,又称“缩小增量排序”,希尔排序是直接插入排序算法的一种更高效的改进版本,关于插入排序可以看下这篇随笔:插入排序——C语言 (图片来源:https://www.cnb ...

  5. 2-路插入排序(2-way Insertion Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia   2-路插入排序(2-way Insertion Sort)的基本思想:     比fis ...

  6. 折半插入排序(Binary Insertion Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia   折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经 ...

  7. 直接插入排序(Straight Insertion Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia   直接插入排序(Straight Insertion Sort)的基本思想是将新记录插入到 ...

  8. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  9. 深入浅出数据结构C语言版(16)——插入排序

    从这一篇博文开始,我们将开始讨论排序算法.所谓排序算法,就是将给定数据根据关键字进行排序,最终实现数据依照关键字从小到大或从大到小的顺序存储.而这篇博文,就是要介绍一种简单的排序算法--插入排序(In ...

  10. C语言学习之插入排序

    此前的一些博文分别写了C语言中经典的排序方式,选择排序 冒泡排序 桶排序,此文就写 插入排序吧. 相对于冒泡排序,插入排序就比较方便快捷了.和冒泡 选择排序一样,插入排序也需要比较大小.可以这样理解插 ...

随机推荐

  1. Going Deeper with Convolutions(Inception v1)笔记

    目录 Abstract Introduction First of All Inception Depth Related Work Motivation and High Level Conside ...

  2. vmware虚拟机添加新硬盘

    1    vmware中添加硬盘 2    重启虚拟机后,fdisk -l 查看已经挂在好的硬盘,比如/dev/sdb3    mkfs.ext3 /dev/sdb4    挂在: mount /de ...

  3. MongoDB删除文档

    db.collection.deleteOne() 删除单个文档db.collection.deleteMany() 删除多个文档db.collection.remove() 删除单/多个文档,db. ...

  4. 51nod 1019 逆序数(逆序数+离散化)

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.   如2 4 3 1中,2 1,4 3,4 1,3 1是 ...

  5. Java程序员从笨鸟到菜鸟之(九十六)深入java虚拟机(五)——java本地接口JNI详解

    http://blog.csdn.net/csh624366188/article/details/8063144 对于Java程序员来说,java语言的好处和优点,我想不用我说了,大家自然会说出很多 ...

  6. hdu1579 Function Run Fun(深搜+记忆化)

    版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/37076755 转载请注明出处 ...

  7. luogu P3941 入阵曲

    嘟嘟嘟 这道题我觉得跟最大子矩阵那道题非常像,都是O(n4)二维前缀和暴力很好想,O(n3)正解需要点转化. O(n4)暴力就不说啦,二维前缀和,枚举所有矩形,应该能得55分. O(n3)需要用到降维 ...

  8. css层叠样式表总结

    一.css css里注释只有一种 /*  */ 二.css与HTML四种结合方式 1.行内样式 在标签中加入style属性 内部的写法:key1:value;key2:value; <div s ...

  9. jQuery中$.ajax()详解(转)

    JQuery中$.ajax()方法参数详解     url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get) ...

  10. 让Git不再难学

    写在前面 在团队做过软件开发的,版本控制必是不可或缺的一项.目前,版本控制主要分为集中式版本控制系统和分布式版本控制系统 ,即大家熟知的SVN和Git.Git是当下最流行的分布式版本控制系统,故,今天 ...