Algorithm - Sorting (Insertion Sort) 插入排序法

想法:

類似玩大老二在整理牌的時候

把所有牌分成已排序區和未排序區

初始假設第一張在已排序區

例如

在第一回合

把第二張拿來跟第一張比較

第二張如果小於第一張 => 第二張放在較小的位置

第二張如果大於第一張 => 第二張放在較大的位置

所以此時第一張和第二張的相對位置會是正確的

(第一二張位在已排序區,其他都是未排序區)

在第二回合

把第三張拿來跟已排序區的做比較

找到對的相對位置後插進去

所以此時這三張牌的相對位置會是正確的

以此類推


要注意一個地方

在插入的地方

要把插入的地方往後的地方(直到已排序區的尾巴)都往後移一格

記得要先移動最後面的值

如果從最前面開始移動

會把值一直往後覆寫


Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void swap(int *a, int *b);
void printarray(int size, int *data);
void generate_random_array(int size, int *data);


void bubblesort(int size, int *data);
void selectionsort(int size, int *data);
void insertionsort(int size, int *data);

void swap(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void printarray(int size, int *data){
    printf("data: ");
    for(int i = 0; i < size; i++){
        printf("%d,", data[i]);
    }
    printf("\n");
}

void generate_random_array(int size, int *data){
    srand(time(NULL));
    for(int i = 0; i < size; i++){
        data[i] = rand()%1000;
    }    
}


#include <stdio.h>
#include <stdlib.h>
#include "Sort.h"

void insertionsort(int size, int *data){
    int i, j, k;
    int tmp;
    for(i = 1; i < size; i++){
        for(j = 0; j < i; j++){
            if(data[j] > data[i]){
                tmp = data[i];
                for(k = i-1; k >= j; k--){
                    data[k+1] = data[k];    
                }
                data[j] = tmp;
                break;
            }
        }
        printarray(size, data);
    }
}

void main(){

    int size = 10;
    int *data = (int*)malloc(sizeof(int) * size);

    //generate random array
    generate_random_array(size, data);
    printf("original:\n");
    printarray(size, data);

    //sorting
    printf("sorting:\n");
    insertionsort(size, data);

    //result
    printf("result:\n");
    printarray(size, data);
}


複雜度:

時間複雜度 O(n^2) 雙重迴圈 

(雖然迴圈看起來是三重,但最裡面那層是接續第二層迴圈繼續往下的意思,所以不會是尋訪三遍)

空間複雜度 O(1) 只需要一個額外的暫存空間

留言

這個網誌中的熱門文章

Formal Verification(正規驗證)介紹和如何使用 SVA(System Verilog Assertion) 做驗證

Quartus Qsys + Nios II 入門使用

Quartus Qsys + Nios II + SDRAM 進階使用