排序——插入排序法

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;

}

運行結果:

相關文章
相關標籤/搜索