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

OJ題解:數列有序 - 有序陣列插入元素

     編輯:關於C語言

題目要求

已有 n (≤100) 個整數按升序排列,插入新整數 m 後保持有序。多組測試資料,n=m=0 結束。

演算法對比

方法時間備註
插入後全排序 (原代碼)O(n²)簡單但非最優
二分查找位置 + 後移元素O(n)最佳:查找 O(log n),移動 O(n)
邊讀邊輸出 (串流)O(n)不需儲存陣列,空間 O(1)

優化版:二分查找 + 後移

#include <stdio.h>

int main() {
    int n, m, a[101], i, pos;
    while (scanf("%d %d", &n, &m) == 2 && (n || m)) {
        for (i = 0; i < n; i++) scanf("%d", &a[i]);
        // 二分查找插入位置
        int L = 0, R = n;
        while (L < R) {
            int mid = (L + R) / 2;
            if (a[mid] < m) L = mid + 1;
            else R = mid;
        }
        pos = L;
        // 後移元素
        for (i = n; i > pos; i--) a[i] = a[i-1];
        a[pos] = m;
        // 輸出
        for (i = 0; i <= n; i++) {
            printf("%d", a[i]);
            if (i < n) printf(" ");
        }
        printf("\n");
    }
    return 0;
}

串流版 (不儲存陣列)

while (scanf("%d %d", &n, &m) == 2 && (n || m)) {
    int printed = 0, x;
    for (int i = 0; i < n; i++) {
        scanf("%d", &x);
        if (!printed && x > m) { printf("%d ", m); printed = 1; }
        printf("%d", x);
        if (i < n-1 || !printed) printf(" ");
    }
    if (!printed) printf("%d", m);
    printf("\n");
}

範例

輸入: 3 3 / 1 2 4
插入位置: 索引2 (0-based)
結果: 1 2 3 4 ✓
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved