插入排序是稳定排序,时间复杂度最低为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. redis持久化方法

    1.redis持久化,来自官方说明 如何选择使用哪种持久化方式? 一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能. 如果你非常关心你的数据, 但仍然 ...

  2. Redis设计与实现读后感

    看了一下时间,现在是2018年8月22日14:28,看完最后一页内容之后,我简短的停留了一下,任思绪翻飞. redis设计与实现大概看了有12天左右,12天前,我的心里很乱,整个人都处于一种焦虑不安的 ...

  3. webpack学习(三)html-webpack-plugin插件

    一.html-webpack-plugin插件 简单创建 HTML 文件,用于服务器访问 例如:我们要为输出文件添加哈希值标记,避免老的不变的文件重新加载,避免新修改的文件受缓存影响. 在前后两次在终 ...

  4. API 网关

    使用 API 网关   链接:https://github.com/oopsguy/microservices-from-design-to-deployment-chinese译者:Oopsguy ...

  5. HDU 6370 Werewolf 【并查集】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6370 Werewolf Time Limit: 2000/1000 MS (Java/Others)   ...

  6. springmvc(5)拦截器

    1.什么是拦截器 是指通过统一的拦截从浏览器发送到服务器的请求来完成相应服务增强 2.拦截器的基本原理 可以通过配置过滤器解决乱码问题 和过滤器非常相似 3.搭建工程 注意jar包 此时的工程是完成后 ...

  7. 使用Scanner将InputStream类型转换成String

    我们在测试项目中经常会遇到这样的情形: 1. 从文件或网络得到一个InputStream,需要转换成String赋值到别的变量做为另一个方法的入参. 2. 从文件或网络得到一个InputStream后 ...

  8. Jmeter-常用函数之__CSVRead使用

    可参照:http://www.cnblogs.com/liu-ke/p/4324157.html 压测中有些参数是固定范围内的取值,或者成对出现(如登录帐号和密码),以大量用户同时登录网站为例: 1. ...

  9. 如何解决使用JMeter时遇到的问题

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...

  10. Ajax全局加载框(Loading效果)的配置

    在Ajax进行后台数据请求的过程中,我们有时候会希望用户能知道页面后台还在做一些事情,这时候就需要给用户一个非常明确的提示,也就是我们所谓的进度条 废话完成~ 实现原理: Jquery可以对ajax进 ...