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

C語言陣列排序演算法大全:冒泡、選擇、快速、插入、希爾五大經典實作

     編輯:關於C語言

五大排序法比較表

演算法平均時間最壞時間空間穩定性適用場景
冒泡排序O(n²)O(n²)O(1)穩定教學、極小資料
選擇排序O(n²)O(n²)O(1)不穩定交換成本高時
快速排序O(n log n)O(n²)O(log n)不穩定通用高效排序
插入排序O(n²)O(n²)O(1)穩定近乎有序/小規模
希爾排序O(n^1.3~1.5)O(n²)O(1)不穩定中等規模、嵌入式

完整實作碼

1. 冒泡排序

void bubble(int *a, int n) {
    for (int i = 0; i < n-1; i++)
        for (int j = i+1; j < n; j++)
            if (a[i] > a[j]) {
                int t = a[i]; a[i] = a[j]; a[j] = t;
            }
}

2. 選擇排序

void select_sort(int *a, int n) {
    for (int i = 0; i < n-1; i++) {
        int k = i;
        for (int j = i+1; j < n; j++)
            if (a[k] > a[j]) k = j;
        if (k != i) { int t = a[i]; a[i] = a[k]; a[k] = t; }
    }
}

3. 快速排序

void quick(int *a, int left, int right) {
    if (left >= right) return;
    int i = left, j = right, pivot = a[(left+right)/2];
    do {
        while (a[i] < pivot) i++;
        while (a[j] > pivot) j--;
        if (i <= j) { int t = a[i]; a[i] = a[j]; a[j] = t; i++; j--; }
    } while (i <= j);
    if (left < j) quick(a, left, j);
    if (i < right) quick(a, i, right);
}

4. 插入排序

void insert_sort(int *a, int n) {
    for (int i = 1; i < n; i++) {
        int tmp = a[i], j = i-1;
        while (j >= 0 && tmp < a[j]) { a[j+1] = a[j]; j--; }
        a[j+1] = tmp;
    }
}

5. 希爾排序

void shell_sort(int *a, int n) {
    for (int gap = n/2; gap >= 1; gap /= 2)
        for (int i = gap; i < n; i++) {
            int tmp = a[i], j = i - gap;
            while (j >= 0 && tmp < a[j]) { a[j+gap] = a[j]; j -= gap; }
            a[j+gap] = tmp;
        }
}

驗證主程式

void print_arr(int *a, int n) {
    for (int i = 0; i < n; i++) printf("%4d", a[i]);
    putchar('\n');
}

int main(void) {
    int base[] = {13,0,5,8,1,7,21,50,9,2};
    int a[5][10];
    for (int i = 0; i < 5; i++) memcpy(a[i], base, sizeof(base));

    printf("Original: "); print_arr(base, 10);
    bubble(a[0], 10); printf("Bubble:   "); print_arr(a[0], 10);
    select_sort(a[1], 10); printf("Select:   "); print_arr(a[1], 10);
    quick(a[2], 0, 9); printf("Quick:    "); print_arr(a[2], 10);
    insert_sort(a[3], 10); printf("Insert:   "); print_arr(a[3], 10);
    shell_sort(a[4], 10); printf("Shell:    "); print_arr(a[4], 10);
    return 0;
}

輸出結果

Original:   13   0   5   8   1   7  21  50   9   2
Bubble:      0   1   2   5   7   8   9  13  21  50
Select:      0   1   2   5   7   8   9  13  21  50
Quick:       0   1   2   5   7   8   9  13  21  50
Insert:      0   1   2   5   7   8   9  13  21  50
Shell:       0   1   2   5   7   8   9  13  21  50

五種演算法同樣輸入產生相同正確輸出,展示各自實作細節與效能特性。

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