基礎排序(冒泡、選擇、插入)學習筆記

quanjun發表於2020-04-16

排序:計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。

最簡單的排序演算法是:氣泡排序、選擇排序和插入排序。

氣泡排序

基本思想:兩個數比較大小,較大的數下沉,較小的數冒起來。

  • 比較相鄰的兩個資料,如果第二個數小,就交換位置。
  • 從後向前兩兩比較,一直到比較最前兩個資料。最終最小的數被交換到最前面的位置,這樣我們就將最小的數放在了最前面的那個位置。
  • 繼續重複上述過程,我們能夠在第二輪實現將第 \(2\) 小的數放在第 \(2\) 個位置,在第三輪實現將第 \(3\) 小的數放在第 \(3\) 個位置,……,執行 \(n-1\) 輪之後,我們便能保證 \(n\) 個數按照從小到大的順序排列好了。

實現程式碼如下:

#include <bits/stdc++.h>
using namespace std;
int n, a[1000];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i < n; i ++) {  // 需要執行n-1輪
        for (int j = n-1; j >= i; j --) {
            if (a[j] > a[j+1]) {
                swap(a[j], a[j+1]); // swap函式用於交換兩個數
            }
        }
    }
    for (int i = 1; i <= n; i ++) cout << a[i] << " ";
    return 0;
}

選擇排序

基本思想:

  • 在長度為 \(n\) 的無序陣列中,第一次遍歷後 \(n-1\) 個數,找到最小的數值與第一個元素交換;
  • 第二次遍歷後 \(n-2\) 個數,找到最小的數值與第二個元素交換;
  • ……
  • \(n-1\) 次遍歷最後一個數,找到最小的數值與第 \(n-1\) 個元素交換,排序完成。

實現程式碼如下:

#include <bits/stdc++.h>
using namespace std;
int n, a[1000];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i < n; i ++) {  // 執行n-1輪
        for (int j = i+1; j <= n; j ++) {   // j從i+1到n遍歷
            if (a[i] > a[j]) {  // 如果a[i]比a[j]大,交換他倆的值
                swap(a[i], a[j]);   // 這樣能夠該輪迴圈結束時保證a[i]比它後面的所有數都要小
            }
        }
    }
    for (int i = 1; i <= n; i ++) cout << a[i] << " ";
    return 0;
}

插入排序

基本思想:

在要排序的一組數中,假定前n-1個數已經排好序,現在將第n個數插到前面的有序數列中,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

我們可以按照理撲克牌的例子來形象地記憶插入排序:

實現程式碼如下:

#include <bits/stdc++.h>
using namespace std;
int n, a[1000];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= n; i ++) {
        int j = i, tmp = a[i];
        while (j>1 && a[j-1]>tmp) {
            a[j] = a[j-1];
            j --;
        }
        a[j] = tmp;
    }
    for (int i = 1; i <= n; i ++) cout << a[i] << " ";
    return 0;
}

相關文章