排序:計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。
最簡單的排序演算法是:氣泡排序、選擇排序和插入排序。
氣泡排序
基本思想:兩個數比較大小,較大的數下沉,較小的數冒起來。
- 比較相鄰的兩個資料,如果第二個數小,就交換位置。
- 從後向前兩兩比較,一直到比較最前兩個資料。最終最小的數被交換到最前面的位置,這樣我們就將最小的數放在了最前面的那個位置。
- 繼續重複上述過程,我們能夠在第二輪實現將第 \(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;
}