資訊人筆記

Work hard, Have fun, Make history!

使用者工具

網站工具


programming:algorithm:sorting:insertion_sort

Insertion Sort

0x00 原理

將資料逐一插入到已經排序好的序列中

下面程式碼實作從序列第二個元素開始處理,與左側(前方)元素進行比較,若小於左側元素則交換,持續至此元素不再向左移動才進入下一輪


0x01 實作

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

void insertion_sort(int array[], int size);
void print_array(int array[], int size);

int main(void)
{
    int average_case[7] = {28, 13, 41, 69, 9, 24, 57};
    int best_case[7] = {9, 13, 24, 28, 41, 57, 69};
    int worst_case[7] = {69, 57, 41, 28, 24, 13, 9};

    insertion_sort(average_case, sizeof(average_case) / sizeof(average_case[0]));
    printf("\n\n");
    insertion_sort(best_case, sizeof(best_case) / sizeof(best_case[0]));
    printf("\n\n");
    insertion_sort(worst_case, sizeof(worst_case) / sizeof(worst_case[0]));
    printf("\n\n");
}

void insertion_sort(int array[], int size)
{

    printf("%-8s", "initial");
    print_array(array, size);
    printf("%-8s%-2s%-10s\n", "compare", "|",  "move");
    printf("------------------------------------------------------------\n");

    int i, j, compare, move;
    for(i = 1; i < size; i++)
    {
        printf("%-s%-4d", "i = ", array[i]);
        compare = 0;
        move = 0;

        for(j = i; j > 0; j--)
        {
            compare++;

            if(array[j - 1] > array[j])
            {
                int tmp = array[j];
                array[j] = array[j - 1];
                array[j - 1]= tmp;
                move++;
            }
            else
            {
                break;
            }
        }

        print_array(array, size);
        printf("%-8d%-2s%-10d\n", compare, "|",  move);
    }
}

void print_array(int array[], int size)
{
    int i;
    for(i = 0; i < size; i++)
    {
        printf("| %-3d", array[i]);
    }

    printf(" | ");
}


0x02 時間複雜度

Case Compare counts Move counts Time Complexity
Best n - 1 0 O(n)
Worst 1 + 2 + 3 +… + (n - 1) = n(n - 1) / 2 1 + 2 + 3 +… + (n - 1) = n(n - 1) / 2 O(n2)
Average O(n2) O(n2) O(n2)

0x03 空間複雜度

沒有使用額外陣列空間,排序在 internal space 完成

空間複雜度為: O(1)


0x04 Stable Sort

元素由左至右處理,當遇到相同大小的元素時並不交換,原先在前(左側)的元素排序後會保持在前,為穩定排序


programming/algorithm/sorting/insertion_sort.txt · 上一次變更: 127.0.0.1