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

C語言插入排序完整實現:從大到小排序 10 個整數

     編輯:C 語言問答

算法核心思想

將陣列分為 **已排序區** 與 **未排序區**,每次從未排序區取首元素,在已排序區中 **從右向左** 找到插入位置,向右移動元素騰出空位,插入該元素。

完整代碼 (降序)


#include <stdio.h>

#define N 10

void insertion_sort_desc(int a[], int n) {
    for (int i = 1; i < n; i++) {
        int key = a[i];
        int j = i - 1;
        // 已排序區 a[0..i-1] 為降序,找第一個 >= key 的位置
        while (j >= 0 && a[j] < key) {
            a[j + 1] = a[j];  // 向右移動
            j--;
        }
        a[j + 1] = key;       // 插入
    }
}

int main() {
    int a[N];
    printf("請輸入 %d 個整數:", N);
    for (int i = 0; i < N; i++) scanf("%d", &a[i]);

    insertion_sort_desc(a, N);

    printf("降序結果:");
    for (int i = 0; i < N; i++) printf("%d ", a[i]);
    putchar('\n');
    return 0;
}

逐輪演示 (輸入: 5 2 9 1 5 6 3 8 4 7)


i=1: [5] 2 → [5, 2]
i=2: [5, 2] 9 → [9, 5, 2]
i=3: [9, 5, 2] 1 → [9, 5, 2, 1]
i=4: [9, 5, 2, 1] 5 → [9, 5, 5, 2, 1]
i=5: [9, 5, 5, 2, 1] 6 → [9, 6, 5, 5, 2, 1]
...
最終: [9, 8, 7, 6, 5, 5, 4, 3, 2, 1]

複雜度與特性

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

優化變體

  • 二分查找插入位置:將 O(n) 查找降為 O(log n),**移動元素仍 O(n)**,總體仍 O(n²) 但常數因子降低。
  • 希爾排序:分組插入排序,間隔序列逐漸縮小至 1,平均 O(n^1.25~1.5)。
  • 雙向插入:雙端隊列減少移動次數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved