排序(二)——氣泡排序及其改進
阿新 • • 發佈:2019-01-26
氣泡排序(Bubble Sort)
氣泡排序(Bubble Sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
氣泡排序演算法的步驟:
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3.針對所有的元素重複以上的步驟,除了最後一個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
#include<stdio.h> void BubbleSort(int arr[], int size) { int i = size; int j = 0; int temp = 0; while (i) { for (j = 0; j < i - 1; ++j) { if (arr[j]>arr[j + 1]) { temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } i--; } } int main(int arc, char* const argv[]) { int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 }; BubbleSort(arr, 10); for (int i = 0; i < 10; ++i) { printf("%4d", arr[i]); } system("pause"); return 0; }
氣泡排序演算法最壞情況和平均複雜度是O(n²),甚至連插入排序(O(n²)演算法複雜度)效率都比氣泡排序演算法更好,唯一的優勢在於基於它的改進演算法——快速排序演算法。
氣泡排序演算法改進
記住最後一次交換髮生位置index的氣泡排序
1.設定一標誌性變數index, 用於記錄每趟排序中最後一次進行交換的位置。由於index位置之後的記錄均已交換到位, 故在進行下一趟排序時只要掃描到pos位置即可。
#include<stdio.h> void BubbleSort(int arr[], int size) { int i = size; int j = 0; int temp = 0; int index = 0; while (i) { for (j = 0; j < i - 1; ++j) { if (arr[j]>arr[j + 1]) { temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } i--; } } int main(int arc, char* const argv[]) { int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 }; BubbleSort(arr, 10); for (int i = 0; i < 10; ++i) { printf("%4d", arr[i]); } system("pause"); return 0; }
2.如果某一趟沒有資料交換,則表示已經排好序,就可以提前終止迴圈。
(ps:因為C中不支援bool型別,所以下面程式碼改成了C++型別,當然如果想在C語言中判斷真假話,可以自己定義下:
typedef
char bool;
#define TRUE 1
#define FALSE 0 )。
#include<stdio.h>
#include<iostream>
using namespace std;
void BubbleSort(int arr[], int size)
{
int i = size;
int j = 0;
int temp = 0;
int index = 0;
bool isEXchange = true;
while (i)
{
for (j = 0; j < i - 1; ++j)
{
if (arr[j]>arr[j + 1])
{
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
index = j;
isEXchange == true;
}
}
i--;
}
}
int main(int arc, char* const argv[])
{
int arr[] = { 1, 3, 5, 7, 8, 4, 9, 12, 3, 0 };
BubbleSort(arr, 10);
for (int i = 0; i < 10; ++i)
{
printf("%4d", arr[i]);
}
system("pause");
return 0;