首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C語言插入排序算法原理與代碼實現

     編輯:C 語言基礎

什麼是插入排序?

插入排序是一種簡單直觀的排序算法,其工作原理類似於整理撲克牌:將未排序區間的元素逐個「插入」到已排序區間的適當位置,保持已排序區間始終有序。

算法核心思想

  • 將數組劃分為「已排序區間」和「未排序區間」
  • 初始時,已排序區間只有第一個元素
  • 每輪從未排序區間取出第一個元素,在已排序區間中從右向左比較,找到插入位置
  • 將插入位置後的元素整體右移一位,騰出空位插入目標元素
  • 重複直到未排序區間為空

逐輪演示(以 3 2 4 1 為例,升序)

輪次已排序區間待插入元素操作過程結果
1[3]22<3,插入位置 0,3 右移[2, 3]
2[2, 3]44>3,直接插入末尾[2, 3, 4]
3[2, 3, 4]11<2,插入位置 0,全部右移[1, 2, 3, 4]

完整 C 語言代碼實現

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

#define N 8

void insertSort(int a[], int n) {
    for (int i = 1; i < n; i++) {        // 共 n-1 輪插入
        int j = 0;
        // 找到插入位置 j(第一個大於 a[i] 的位置)
        while (j < i && a[j] < a[i]) j++;
        
        if (i != j) {                    // 需要插入時才移動元素
            int temp = a[i];
            for (int k = i; k > j; k--)  // 元素右移
                a[k] = a[k - 1];
            a[j] = temp;                 // 插入目標元素
        }
    }
}

int main() {
    int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
    
    insertSort(num, N);
    
    printf("排序結果:\n");
    for (int i = 0; i < N; i++) printf("%d ", num[i]);
    printf("\n");
    return 0;
}

運行結果

排序結果:11 19 25 38 44 78 89 96

算法特性分析

特性說明
最好時間複雜度O(n)(已有序序列)
平均/最壞時間複雜度O(n²)
空間複雜度O(1),原地排序
穩定性穩定(相等元素相對順序不變)
適應性對近乎有序數據極快

為什麼插入排序是穩定的?

比較時條件為 a[j] < a[i](嚴格小於),遇到相等元素不移動,直接插入到相等元素後面,保持原有相對順序。

優化變體:二分插入排序

查找插入位置時可用二分查找替代線性查找,將比較次數從 O(n) 降為 O(log n),但元素移動次數仍為 O(n²),整體複雜度不變,適合比較操作昂貴的場景。

適用場景

  • 數據量較小(n < 50)
  • 數據基本有序或近乎有序
  • 需要穩定排序且空間受限
  • 作為快速排序、歸並排序的小區間優化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved