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

C 語言不定長數組排序:冒泡排序通用實現

     編輯:程式設計疑難解答

問題分析

題目要求「給一組數組從小到大排列,也沒說幾個數」。這意味著需要編寫可處理任意長度數組的排序函數,通常接收數組指針和長度參數。

冒泡排序標準實現

#include <stdio.h>

/**
 * 冒泡排序:升序
 * @param arr 數組首地址
 * @param n   數組元素個數
 */
void bubble_sort(int *arr, int n) {
    if (n <= 1) return; // 0 或 1 個元素無需排序
    
    for (int i = 0; i < n - 1; ++i) {
        int swapped = 0; // 優化標誌:若某輪無交換,說明已有序
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
        if (!swapped) break; // 提前結束
    }
}

// 測試主函數
int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]); // 計算數組長度
    
    printf("排序前: ");
    for (int i = 0; i < n; ++i) printf("%d ", arr[i]);
    
    bubble_sort(arr, n);
    
    printf("\n排序後: ");
    for (int i = 0; i < n; ++i) printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

關鍵點解析

點說明
參數設計int *arr 等價 int arr[],配合 int n 傳遞長度,實現不定長支持
長度計算主調函數用 sizeof(arr)/sizeof(arr[0]) 計算,作為參數傳入
優化標誌swapped 讓最好情況(已有序)時間複雜度降為 O(n)
邊界處理n <= 1 直接返回,避免循環條件溢出

其他排序算法對比(供進階學習)

算法平均時間最壞時間空間穩定性適用場景
冒泡排序O(n²)O(n²)O(1)穩定教學、極小數據
快速排序O(n log n)O(n²)O(log n)不穩定通用、標準庫 qsort
歸併排序O(n log n)O(n log n)O(n)穩定外部排序、鏈表
堆排序O(n log n)O(n log n)O(1)不穩定嵌入式、實時系統

實戰建議

  • 實際項目直接使用 qsort(<stdlib.h>),只需編寫比較函數:
    int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; }
    qsort(arr, n, sizeof(int), cmp);
    
  • 嵌入式/面試手寫時,冒泡/選擇/插入排序碼量最小,但說明時間複雜度與優化點可加分。
  • 理解穩定性概念:相等元素相對順序不變,多關鍵字排序時必需。

總結

掌握「數組指針 + 長度參數」的函數接口設計,配合冒泡排序基礎實現,即可解決不定長數組排序問題。進階學習 qsort、快排分區邏輯,構建完整算法工具箱。

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