排序——插入排序法

1、插入排序法概念算法

    插入排序(Insertion Sort)的算法是一种简单直观的排序算法。它的工做原理是经过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入该数据,使数据造成有序排列。
    插入排序在算法实现时,在从后向前扫描过程当中,须要反复把已排序元素逐步向后移动,为最新元素提供插入空间。数组

2、算法描述测试

通常地,插入排序都在一个数组上进行。具体算法描述以下:
(1)对于第1个元素,由于没有比较,将其做为已经有序的序列。
(2)从数组中获取下一个元素,在已经排序的元素序列中从后向前扫描,并判断该元素与已排序元素的大小。
(3)若排序序列的元素大于新元素,则将该元素移到下一位置。
(4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
(5)将新元素插入到该位置。
(6)重复步骤2~5,直到将数组中的数据处理完。下面以一组待排序的数据演示插入排序的过程,假设有8个
须要排序的数据序列以下:
69,65,90,37,92,6,28,54
经过插入排序法进行排序的过程以下图1所示。code

                               

图1 插入排序过程排序

(1)在原始数据中,将第1个数据做为已排序的数据序列。io

(2)取出第2个数据,将其与已排序的数据进行比较,因第2个数据小于第1个数据,将这两个数据进行交换,
完成第1次插入排序。
(3)取出第3个数据,将其与已排序的数据(前两个数据)进行比较,因第3个数据大于已排序的两个数据,不须要进行交换。
(4)这样重复操做,最后获得有序的数据序列。class


注意:由上图1可看出,在插入排序中,可能会存在大量数据的移动操做。例如,第5次排序时,取第6个数据(值为6),由于该值比全部数据都小,所以须要向前移动6次才完成排序。原理

3、算法的实现gc

一、插入排序法实现im

/**
 *直接插入排序
 * */
void InsertSort(int a[], int n)
{
    int i, j, t;

    for (i=1; i<n; i++) {
        t = a[i];

        for (j=i-1; j>=0 && t<a[j]; --j)
            a[j+1] = a[j];

        a[j+1] = t;
    }

}

二、插入排序法测试

#include <stdio.h>
#include <stdlib.h>
#include "InsertSort.c"

#define ARRAYLEN 8

int main(int argc, char *argv[])
{
    int i;
    int a[ARRAYLEN] = {69, 65, 90, 37, 92, 6, 28, 54};

    printf("原数据:");
    ShowData(a, ARRAYLEN);

    InsertSort(a, ARRAYLEN);
    printf("排序后:");
    ShowData(a, ARRAYLEN);
    return 0;

}

运行结果: