排序:即將一組混亂的數據按從小到大或者從大到小的順序進行有序的排列出來。
冒泡排序算法圖解:
思路解答:
從第一個數據開始,與其後一個數據進行比較,如果後面的數據比他小,則它兩互相交換位置;然後再從第二個數據開始,與其後一個數據進行比交,如果後面的數據比他小,則它兩互相交換位置;然後再從第三個數據開始…;如果有遇到後面的數據比它還要大的,則無需交換。
時間複雜度:O(n2)
代碼實現:
void BubbleSort(int *arr, int len) {
for (int i = 0; i < len - 1; i++) { // 操作n-1次
for (int j = 0; j < len - i - 1; j++) { // 後面的數據已經排好序,所以需要減去i次
if (arr[j] > arr[j + 1]) { // 如果前面的比後面的要大
int ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
}
}
}
}
上面的代碼是實現冒泡算法的一種方式,當然也還有特殊情況下效率高的算法。
例如需要將這一堆數據進行排序:{ 154, 155 , 157, 174, 162, 159, 160, 161, 171 }
深色的表示已經排好序了,後續就不需要再進行比較了!
第一次排序:154, 155, 157, 162, 159, 160, 161, 171, 174
第二次排序:154, 155, 157, 159, 160, 161, 162, 171, 174
第三次排序:154, 155, 157, 159, 160, 161, 162, 171, 174
可以看出,特殊情況,排序兩次後就排好序了,所以我們再第三次排序確認沒有數據再進行交換後,就說明這一組數據是已經排好序的了,就可以結束循環了!
改進後的冒泡排序算法代碼:
void BubbleSort(int* arr, int len) {
for (int i = 0; i < len - 1; i++) { // 操作n-1次
bool sorted = true; // 假如n次比較後已經排好序,但是他還沒有走完循環,可以利用它來結束循環,效率提高
for (int j = 0; j < len - i - 1; j++) { // 後面的數據已經排好序,所以需要減去i次
if (arr[j] > arr[j + 1]) { // 如果前面的比後面的要大
int ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
sorted = false; // 當有執行交換操作,賦值false
}
}
if (sorted) break; // 爲真時,說明循環一輪後,沒有執行交換操作,即已經排好序了,直接結束循環
}
}
此時,算法效率就大大提高了!!!
全部代碼實現:
#include <iostream>
#include <Windows.h>
using namespace std;
void BubbleSort(int* arr, int len) {
for (int i = 0; i < len - 1; i++) { // 操作n-1次
bool sorted = true; // 假如n次比較後已經排好序,但是他還沒有走完循環,可以利用它來結束循環,效率提高
for (int j = 0; j < len - i - 1; j++) { // 後面的數據已經排好序,所以需要減去i次
if (arr[j] > arr[j + 1]) { // 如果前面的比後面的要大
int ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
sorted = false; // 當有執行交換操作,賦值false
}
}
if (sorted) break; // 爲真時,說明循環一輪後,沒有執行交換操作,即已經排好序了,直接結束循環
}
}
int main(void) {
int beauties[] = { 154, 155 , 157, 174, 162, 159, 160, 161, 171 };
// 計算數組的元素個數
int len = sizeof(beauties) / sizeof(beauties[0]);
BubbleSort(beauties, len);
for (int i = 0; i < len; i++) {
cout << beauties[i] << ", ";
}
cout << endl;
system("pause");
return 0;
}
運行截圖: