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

C 語言陣列插入排序:預先初始化陣列的實戰演練

     編輯:關於C語言

題目:有序陣列插入新元素並保持排序

給定一個已排序的整數陣列 (大小 11,前 10 個元素有值,第 11 個預留為 0),輸入一個新數字,插入適當位置使陣列維持升序。

完整程式碼

#include 

int main() {
    int a[11] = {1,4,6,9,13,16,19,28,40,100}; // 第 11 個元素自動初始化為 0
    int temp1, temp2, number, end, i, j;

    printf("original array is:\n");
    for (i = 0; i < 11; i++) printf("%5d", a[i]);
    printf("\n");

    printf("insert a new number: ");
    scanf("%d", &number);

    end = a[9]; // 目前最大值 (第 10 個元素)
    if (number > end) {
        a[10] = number; // 直接放入預留位置
    } else {
        for (i = 0; i < 10; i++) {
            if (a[i] > number) { // 找到插入點
                temp1 = a[i];
                a[i] = number;
                for (j = i + 1; j < 11; j++) { // 後移後續元素
                    temp2 = a[j];
                    a[j] = temp1;
                    temp1 = temp2;
                }
                break;
            }
        }
    }

    for (i = 0; i < 11; i++) printf("%6d", a[i]);
    printf("\n");
    return 0;
}

執行範例

original array is:
    1    4    6    9   13   16   19   28   40  100    0
insert a new number: 25
     1     4     6     9    13    16    19    25    28    40   100

關鍵技術點

  1. 陣列自動初始化:int a[11] = {...}; 僅給 10 個初始值,第 11 個自動為 0 (C 標準保證)
  2. 雙暫存變數輪換後移:temp1 持有被取代值,temp2 暫存下一個被取代值,實現原地後移無需額外陣列
  3. 邊界處理:新數字大於所有現有值時,直接放入預留位置,避免迴圈越界

演算法複雜度

  • 時間:O(n) — 最壞情況需掃描並後移所有元素
  • 空間:O(1) — 僅使用常數額外空間

改進與擴充

  • 使用二分搜尋找插入點 O(log n),但後移仍為 O(n)
  • 改用鏈結串列:插入 O(1) 但搜尋 O(n),適合頻繁插入刪除場景
  • 泛型化:以 void* + 比較函式指標支援任意型別
  • 標準庫實作:C++ std::vector::insert、C bsearch + memmove

教學價值

這是經典「陣列操作」入門題,強迫練習:索引邊界控制、元素搬移邏輯、邊界條件處理。建議初學者在紙上模擬 temp1/temp2 輪換過程,內化「原地後移」核心模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved