氣泡排序(bubble sort)一種交換排序。
基本思想:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。
以公升序冒泡為例:每趟排序過程中通過兩兩比較相鄰元素,將小的數字放到前面,大的數字放到後面。
核心**:
void bubblesort(int arr,int size)
} }}
完整**:
#include#includevoid bubblesort(int arr,int size)
printf("排序中:");
for(k = 0; k < size;k++)
printf("\n");
} printf("排序的結果:");
for(k = 0; k < size;k++)
printf("\n"); }}
int main();
int length;
int i, j;
length = sizeof(arr)/sizeof(arr[0]);
printf("排序前:\n");
演算法效能
時間複雜度
若檔案的初始狀態是正序的,一趟掃瞄即可完成排序。所需的關鍵字比較次數c和記錄移動次數m均達到最小值:cmin = n - 1, mmin = 0。所以,氣泡排序最好時間複雜度為o(n)。
但是上述**,不能掃瞄一趟就完成排序,它會進行全掃瞄。所以乙個改進的方法就是,當冒泡中途發現已經為正序了,便無需繼續比對下去。
若初始檔案是反序的,需要進行 n -1 趟排序。每趟排序要進行 n - i 次關鍵字的比較(1 ≤ i ≤ n - 1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
cmax = n(n-1)/2 = o(n^2)
mmax = 3n(n-1)/2 = o(n^2)
氣泡排序的最壞時間複雜度為o(n^2)。
因此,氣泡排序的平均時間複雜度為o(n^2)。
總結:當資料越接近正序時,氣泡排序效能越好。
空間複雜度
o(1)
演算法穩定性
氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。
所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。
改進:
對氣泡排序常見的改進方法是加入標誌性變數flag,用於標誌某一趟排序過程中是否有資料交換。
如果進行某一趟排序時並沒有進行資料交換,則說明所有資料已經有序,可立即結束排序,避免不必要的比較過程。
核心**:
void bubblesort(int arr,int size)
} }}
完整**:
#include#includevoid bubblesort(int arr,int size)
printf("排序中:");
for(k = 0; k < size;k++)
printf("\n");
} if(false == flag)
printf("排序的結果:");
for(k = 0; k < size;k++)
printf("\n"); }}
int main();
//int arr =;
int arr = ;
int length;
int i, j;
length = sizeof(arr)/sizeof(arr[0]);
printf("排序前:\n");
資料結構 氣泡排序
起泡排序的過程很簡單。首先將第乙個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序,則將兩個記錄交換之,然後比較第二個記錄和第三個記錄的關鍵字。依次類推,直至第n 1個記錄和第n個記錄的關鍵字進行比較為止。上述過程稱作第一趟起泡排序,其結果使得關鍵字最大的記錄被安置到最後乙個記錄的位置上。然後進行...
資料結構 氣泡排序
氣泡排序演算法的基本思想是 假設待排序表長為n,從後往前 或從前往後 兩兩比較相鄰元素的值,若為逆序 即a i 1 a i 則交換它們,直到序列比較完。我們稱它為一趟冒泡,如果將最小的元素交換到待排序序列的第乙個位置 關鍵字小的元素往上 漂浮 這就是氣泡排序名字的由來 下一趟冒泡時,前一趟確定的最小...
資料結構 氣泡排序
目標效果 原始碼 include void print out int a,int n void bubble sort int a,int n int main printf 起泡排序 n printf 排序前 n printresult a,10 排序方法 bubblesort a,10 pri...