排序演算法(四)氣泡排序及其優化
阿新 • • 發佈:2019-01-23
基本思路:
氣泡排序的基本思路是通過元素的兩兩比較不斷將較大值(升序)或則較小值(降序)移動序列的後面,類似於氣泡向上冒的排序演算法。
1、比較相鄰兩個元素大小,如若不符合要求則交換元素;
2、對整個序列做同樣1的操作,最後的元素一定是當前比較的序列中最大(或最小)的元素;
3、重複以上操作除了上一次遍歷的最後一個元素。
圖解(升序):
我們可以根據氣泡排序原理寫出程式碼:
void BubbleSort(int arr[], int len)//升序
{
int i = 0;
int j = 0;
for (i = 0; i < len; i++)
{
for (j =i+1; j <len ; j++)
{
if (arr[i] > arr[j])
{
swap(arr[i], arr[j]);
}
}
}
但是,如圖所示,第七趟排完已經是有序,但是上面的程式碼,還會多走幾趟,為了提高效率,我們可以優化以上程式碼,用一個標誌位來標識某一趟是否有交換資料,如果某一趟沒有一個數據進行交換,做說明已經有序,可以直接停止。
如下給出優化後的程式碼:
void BubbleSort(int arr[], int len)//升序
{
int i = 0;
int j = 0;
int flag = 1;//
for (i = 0; i < len && flag; i++)
{
flag = 0; //假設有序,經過一趟比較後若有序,則flag值不變,下趟可直接結束迴圈
for (j = i + 1; j <len; j++)
{
if (arr[i] > arr[j])
{
flag = 1; //若發生交換,則改變flag的值
swap(arr[i], arr[j]);
}
}
}
}
測試程式碼如下:
int main()
{
int arr[] = { 0,9,1,4,7,5,3,6,2,8 };
int len = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, len);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}