排序 - 冒泡法(改进)
生活随笔
收集整理的這篇文章主要介紹了
排序 - 冒泡法(改进)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
排序過程:
將第一個記錄的keyword與第二個記錄的keyword進行比較,若為逆序r[1].key > r[2].key,則交換;然后比較第二個記錄與第三個記錄;依次類推,直至第n - 1個記錄和第n個記錄比較為止,第一趟冒泡排序,結果keyword最大的記錄被安置在最后一個記錄上。
對前n - 1個記錄進行第二趟冒泡排序。結果使keyword次大的記錄被安置在第n - 1個記錄位置。
反復上述過程,直到“在一趟排序過程中沒有進行過交換記錄的操作”為止。
時間復雜度O(n^2)
簡單版:
#include <iostream> #include <cstdio> #include <ctime> #include <iomanip> using namespace std;int arr[10000];void mySwap(int &a, int &b) {int t = a;a = b;b = t; }void bubbleSort(int *a, int len) {bool alreadySort = false; // 記錄假設已經排序完畢,能夠提前退出for (int i = len - 1; i >= 0 && !alreadySort; i--) { // 從后往前排序alreadySort = true;for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {mySwap(a[j], a[j + 1]);alreadySort = false;}}} }void printArray(int *a, int len) {for (int i = 0; i < len; i++) {if (i != 0 && i % 10 == 0) {cout << endl;}cout << setw(3) << a[i] << ' ';}cout << endl; }int main() {srand(time(0));cout << "Please input length of array: ";int len;cin >> len;for (int i = 0; i < len; i++) {arr[i] = rand() % 100;}cout << "Before sorting:\n";printArray(arr, len);bubbleSort(arr, len);cout << "After sorting:\n";printArray(arr, len);return 0; }/* Please input length of array: 20 Before sorting: 70 53 65 69 99 67 36 49 66 16 58 73 65 20 75 30 93 8 42 57 After sorting: 8 16 20 30 36 42 49 53 57 58 65 65 66 67 69 70 73 75 93 99 */改進:記住最后一次交換發生的位置lastExchange,下一趟排序開始時,R[1...lastExchange]是無序區,R[lastExchange...n]是有序區。這樣一趟排序可能使當前有序區擴充多個記錄,從而降低排序的趟數。
僅僅需改進bublleSort函數:
void bubbleSort(int *a, int len) {bool alreadySort = false; // 記錄假設已經排序完畢。能夠提前退出for (int i = len - 1; i >= 0 && !alreadySort;) { // 從后往前排序alreadySort = true;int lastExchange = i; // 記住最后一次交換的位置,能夠降低排序趟數for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {mySwap(a[j], a[j + 1]);alreadySort = false;lastExchange = j;}}i = (lastExchange < i ? lastExchange : i - 1);} }總結
以上是生活随笔為你收集整理的排序 - 冒泡法(改进)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于blog的编写 规则
- 下一篇: 抓包工具 - Fiddler(详细介绍)