插入排序算法的一种实现

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。(摘自维基百科)

简单点理解就是这样:想象你拿着一副杂乱的扑克牌,然后你就会自然地将手中的牌换下位置,使其排好顺序对不对?以下的图片是借用《算法导论》的例子。

所以说插入排序就是分成两块区域,一块是已排好序的,另外一块是还没排好序的;只要你不断的从还没排好序的那块中取元素插入到已排好序的那块上,那么等到还没排序好的那块里的元素没了,就代表已经排好序了。

思路很简单,下面给出我的代码(排序函数的第二个for循环的前三句是为了能够直观地输出排序过程):

 1 /*
 2  *    这是我自己写的插入排序的写法,跟书本上的思想一样,
 3  *    都是插入,不过实现的代码有所不同。
 4  */
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<time.h>
 8 #define M 10
 9
10 void insertion_sort(int *p)
11 {
12     int i, j, tmp;
13     for(i = 1;i < M; i++)
14         for(j = 0; j < i; j++)
15         {
16             printf( "%2d ", *(p + j) );    /* 输出 */
17             if(j + 1 == i)            /* 输出 */
18                 printf( "\n" );        /* 输出 */
19             if(*(p + j) > *(p + i))
20                 {
21                     tmp = *(p + j);
22                     *(p + j) = *(p + i);
23                     *(p + i) = tmp;
24
25                 }
26         }
27 }
28
29 int main(void)
30 {
31     int i;
32     int a[M] = {0};
33
34     //随机生成10个两位数
35     srand(time(0));
36     for(i = 0; i < M; i++)
37         a[i] = rand() % 100;
38
39     printf( "未排序。。。\n" );
40     for(i = 0; i < M; i++)
41         printf( "%2d ", a[i] );
42         printf( "\n" );
43     printf("\n排序中。。。\n");
44     insertion_sort(a);
45
46
47     printf( "\n已排序。。。\n" );
48     for(i = 0; i < M; i++)
49         printf( "%2d ", a[i] );
50
51         printf( "\n" );
52
53     return 0;
54
55 }

下面是运行的结果:

时间复杂度就是O(n^2)了,因为有两个循环嘛。

时间: 2024-10-24 17:18:48

插入排序算法的一种实现的相关文章

插入排序算法回顾(python实现)

插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止. 折半插入排序是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中.由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度.具体操作为:在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与

数据结构——排序——直接插入排序和折半插入排序算法

直接插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]: 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成. #include<stdio.h> #include<stdbool.h> vo

插入排序---希尔插入排序算法(Javascript版)

取一个小于n的整数作为第一个增量,把序列分组.所有距离为增量的倍数的元素放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1,即所有元素放在同一组中进行直接插入排序为止. 一般的初次取序列的一半为增量,以后每次减半,直到增量为1. 以下代码在nodejs中执行通过. function shellInsertSort(elements, di){ //从增量的所在位置开始 for(var i = di; i < elements

“深入理解”—插入排序算法

总结下自己对插入排序的理解. 插入排序算法思想:每趟将一个元素,按照其关键字的大小插入到它前面已经排序的子序列中,依此重复,直到插入全部元素. 插入排序包括:直接插入排序.二分插入排序以及希尔排序. 1.直接插入排序: public void insert(int[] a) { for(int i=1;i<a.length;i++) //n-1此扫描,依次向前插入n-1个元素 { int temp=a[i]; //每趟将a[i]插入到前面的排序子序列中 int j; for(j=i-1;j>=

插入排序算法

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序算法.插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序. 插入排序的Java实现: 1 package com.mianshi.easy; 2 public class Insert { 3 4 public static void main(String[] args) { 5

插入排序算法---插入排序与希尔排序

本文主要说明插入排序.shell排序两种排序方法.  一.插入排序  算法思想:  假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性. 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果

插入排序算法之直接插入排序和希尔排序

插入排序算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据. 直接插入排序 直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入. 例子: 有序列: 开始时,有序序列只有一个元素就是第一个元素(红色),后面的无序序列(绿色).接下来,取无序序列中

排序算法之直接插入排序算法

基本思想 当插入第i(i≥1)个元素,前面的i-1个元素已经排好序.这时用第i个元素与前i-1个元素进行比较,找到插入位置即将第i个元素插入,原来位置上的元素向后顺移. 代码: //待排数据存储在数组a中,以及待排序列的左右边界 public void InsertSort(int[] a, int left, int right) { int temp;//临时变量 int i, j;//循环标记 for (i = left + 1; i <= right; i++) {//遍历待排序列 if

【插入排序算法】初学算法之排序--直接插入排序

前言: 厚厚一本<算法第四版>,看到五分之一就已经收益良多,而前五分之一又大部分是关于排序,有冒泡排序.快速排序.堆排序.直接插入排序.希尔排序等等,理解起来也不算特别的难,今天就跟大家分享其中的一种 —— 直接插入排序算法,这里我实现了javascript和java两个语言版本. 思路: 在生活中,如果我们要对扑克牌按大小排序,我们会怎么排呢? ① 首先找出一张牌 放在桌子上 ② 拿出第二张牌,比第一张小就放上面,比第一张大就放下面 ③ 拿出第三张牌,比第一张小就放上面,比第一张大就和第二张