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

C 語言數組去重後求最大值與次大值:覆蓋法刪除重複 + 選擇排序實戰

     編輯:關於C語言

問題描述

輸入 7 個整數,先去除重複元素,再輸出去重後的最大值與次大值。

核心算法:原地去重(覆蓋法)

雙層循環遍歷,發現重複時將後續元素前移覆蓋,長度 `len` 遞減,內層索引 `m` 回退重新比較。

int len = 7;
for (int j = 0; j < len; ++j) {
    for (int m = j + 1; m < len; ++m) {
        if (a[j] == a[m]) {
            for (int k = m + 1; k < len; ++k)
                a[k-1] = a[k];  // 覆蓋刪除
            --len;
            --m;                // 當前位置已換新值,需重新比較
        }
    }
}

求最大/次大值:簡單選擇排序降序

for (int n = 0; n < len; ++n)
    for (int p = n + 1; p < len; ++p)
        if (a[n] <= a[p]) swap(a[n], a[p]);
// a[0] 為最大,a[1] 為次大

完整可運行代碼

#include <stdio.h>
int main() {
    int a[7];
    printf("input seven numbers: ");
    for (int i = 0; i < 7; ++i) scanf("%d", &a[i]);

    int len = 7;
    for (int j = 0; j < len; ++j)
        for (int m = j + 1; m < len; ++m)
            if (a[j] == a[m]) {
                for (int k = m + 1; k < len; ++k) a[k-1] = a[k];
                --len; --m;
            }

    printf("去重後: ");
    for (int i = 0; i < len; ++i) printf("%d ", a[i]);
    printf("\n");

    for (int n = 0; n < len; ++n)
        for (int p = n + 1; p < len; ++p)
            if (a[n] <= a[p]) { int t=a[n]; a[n]=a[p]; a[p]=t; }

    printf("排序後: ");
    for (int i = 0; i < len; ++i) printf("%d ", a[i]);
    printf("\nMAX=%d, S_MAX=%d\n", a[0], a[1]);
    return 0;
}

運行示例

input seven numbers: 7 5 7 5 8 6 8
去重後: 7 5 8 6
排序後: 8 7 6 5
MAX=8, S_MAX=7

優化方向

  • 去重:排序後相鄰去重 O(n log n) 或 哈希集合 O(n);
  • 求 Top2:單次遍歷維護 `max1`、`max2` 即可 O(n),無需全排序;
  • 工程建議:使用 `std::vector` + `std::sort` + `std::unique` 或 `std::unordered_set` 現代 C++ 風格,簡潔且無手動內存管理風險。
本文整理自 “Jean_Z的學習博客”,原文鏈接:https://7905490.blog.51cto.com/7895490/1299815
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved