插入排序——C语言

插入排序

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

 (每步将一个待排序的元素,按其排序码大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止)

具体算法描述如下:

1、将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列;

2、取出下一个元素,在已经排序的元素序列中从后向前扫描;

3、如果该元素(已排序)大于新元素,将该元素移到下一位置;

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

5、将新元素插入到该位置后;

6、重复步骤2~5。

排序过程示例如下图:

(图片来源:https://www.cnblogs.com/chengxiao/p/6103002.html)

代码实现:

 1     /* 插入排序*/
 2     int num[5] = {3, 7, 1, 8, 5};
 3     int pos, cur;
 4     int i;
 5     int length = sizeof(num)/sizeof(num[0]);
 6
 7     for (i = 1; i < length; i++)
 8     {
 9         pos = i -1 ;    //有序序列的最后一个元素位置
10         cur = num[i];    //保存待排序元素的值
11         while ( pos >= 0 && num[pos] > cur)
12         {
13             num[pos + 1] = num[pos];
14             pos--;
15         }
16         num[pos + 1] = cur;    //将待排序元素插入数组中
17     }

排序过程:以上面的例子来说排序的对象是 3,7,1,8,5 数组长度为5,因为第一个元素可以认为已经被排序,所以for循环的次数是:5(数组长度) - 1 = 4

第一次for循环:

3>7不成立,插入待排序元素,数组不变,此时有序序列为3,7

第二次for循环:

7>1成立,数组变成3,7,7,8,5

3>1成立,数组变成3,3,7,8,5

插入待排序元素,此时数组为1,3,7,8,5,有序序列为1,3,7

第三次for循环:

7>8不成立,插入待排序元素,数组不变,此时有序序列为1,3,7,8

第四次for循环:

8>5成立,数组变成1,3,7,8,8

7>5成立,数组变成1,3,7,7,8

3>5不成立,插入待排序元素,此时数组为1,3,5,7,8,有序序列为1,3,5,7,8,排序完成

原文地址:https://www.cnblogs.com/lanhaicode/p/11259509.html

时间: 2024-08-06 03:25:23

插入排序——C语言的相关文章

插入排序C语言实现

插入排序可是说是最简单的排序算法之一了,时间复杂度是O(N^2),下面是C语言实现 void insertion_sort(int *A, int n) { int i, j, x; //i从1开始而不是从0或2开始 for (i = 1; i < n; i++) { x = A[i]; j = i - 1; //j >= 0时迭代,j的位置可以看成是"空槽的前一个位置",所以最后一个空槽是下标为0的地方 while (j >= 0 && A[j] &

直接插入排序C语言实现

直接插入排序是最简单的排序算法,基本思想是每次将一个带排序的记录,按其关键字大小插入到前面已排序好的子序列中,直到全部数据完成. 其相应的C代码实现如下: #include "stdio.h" void InsertSort(int a[], int n)  //直接插入排序{ int i,j,temp=0; for(i=1;i<n;i++) { if(a[i]<a[i-1]) { temp = a[i]; for(j=i-1;j>=0 && a[j]

【算法】插入排序C语言实现

不知道大家喜不喜欢打扑克?哈哈,我就挺喜欢的,尤其是三人斗地主,很喜欢.现在我来描述一幅画面看看大家熟不熟悉. 我抓牌的习惯是,在抓牌的时候,我要看着我的牌,看看牌的状况,有没有大小鬼,有几个2,有没有长的连,顺便做好基本的排序工作.比如我第一张牌抓的是7,放在手里,第二张牌是J,我把它放在7的后面(对,我默认是左到右升序的的),第三张是10,我把它放在7和J之间,第四张牌还是10,那么我就有两个位置可以防止这个刚刚到来的10,一是把他放在J的前面,二是把它放在第一个10的前面也就是7的后面,这

直接插入排序(带哨兵和不带哨兵)

前言 插入排序(insertion sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止. 直接插入排序 基本思想 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2..n].从i = 2起直到i = n 为止,依次将R[i]插入当前的有序区R[1..i - 1]中,生成含n个记录的有序区. 排序方法 将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i - 2,

常见的9种内部排序(C语言实现)

现在已经把常见的9种内部排序算法都用C语言实现了,为了方便自己和大家查看,就弄了这么一个类似于导航目录的东西. 一.冒泡排序 冒泡排序(C语言版) 二.选择排序 选择排序(C语言版) 三.直接插入排序 直接插入排序(C语言版) 四.希尔排序 希尔排序(C语言版) 五.归并排序 归并排序(C语言版) 六.基数排序 基数排序(C语言版) 七.快速排序 快速排序(C语言版) 八.计数排序 计数排序(C语言版) 九.堆排序 堆排序(C语言版) 介绍完这九个常用的排序算法,怎么能没有一个比较呢?下面是我对

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

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 直接插入排序(Straight Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行直接插入排序,从而得到了有序表,具体步骤为 若新记录<有序表高位l.r[j],则设置哨兵 有序表后移,j+1=j 重复第2步,直至新纪录>=有序表中的j记录,则j+1就是要插入的位置 从而得到一个新的.记录数增加1的有序表

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

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行折半插入排序,从而得到了有序表,具体步骤为 先将记录存在L.r[0]中,low=有序表低位下标,high=有序表高位下标 若low<=high,就将L.r[0]与mid=(low+high)/2位的数据比较,如果L.r[0]>

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

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 2-路插入排序(2-way Insertion Sort)的基本思想: 比fisrt小的元素,插入first前面: 比final大的元素,插入final后面, 比fisrt大且比final小的元素插中间 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 1 #include <stdio.h> 2 #define LEN 6 3 4 typedef float

排序(2)---------简单插入排序(C语言实现)

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 通俗解释: ①假设初始序列的第一个元素是有序的(当一个序列只有1个元素时,我们可以认为其是有序的). ②从第二个元素开始与前面的元素进行比较,如果比前面的大