C語言 - 氣泡排序【演算法優化】
氣泡排序很好理解,但是如何能夠讓其更加有效的執行是需要我們一直思考的問題。
本文會使用C語言(部分C++語法)介紹氣泡排序演算法並結合實際情況對齊進行優化,增強其健壯性。
****************************************************************************************************************************************
一:氣泡排序演算法【初】
void Bubble_Sorted(int *array,int length) //氣泡排序演算法 { int temp; for (int i = length-1; i>0; i--) { for (int j = 0; j < i; j++) { if (array[j] > array[j + 1]) { temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
實際情況問題:
一下給出兩組資料,要求使用氣泡排序對齊進行從小到大的排序:
1> 5 6 25 78 1 50 33 77 2
2> 55 5 6 25 35 62 69 88
很明顯,第二組資料後面7個數據都已經是有序的,這個時候使用上面的冒泡演算法便做了許多冗餘的工作。
二:氣泡排序演算法【優化一】
優化思路:
因為氣泡排序時雙重迴圈,於是我們可以通過增加一個bool型變數exchange在內層迴圈之前;
以上面的第二組資料為例,第一次將55移到35後面,exchange由fause變為true表示被改變,
因為內層迴圈需要對後面的資料進行一一比較,當第一層迴圈進行到第二次的時候,內層迴圈沒有進行一次交換,exchange的值不變(間接說明了後面的資料已經有序,可以直接在第一層迴圈後通過判斷exchange的值來直接終止程式)
void Bubble_Sorted(int *array,int length) { int temp; for (int i = length-1; i>0; i--) { bool exchange = false; for (int j = 0; j < i; j++) { if (array[j] > array[j + 1]) { temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; exchange = true; } } if (!exchange) return; } }
三:氣泡排序演算法【優化二】
再舉一組資料:
4 3 2 1 5 6 7 8 9 10
使用第二種優化後的演算法後,可以減少外迴圈的次數,但是在前面幾次比較排序的過程中,後面的那些有序部分還是被用來和前方一一比較了
第三種優化主要解決這個問題:主要思想 -> 動態更改內層迴圈的終止條件。
void Bubble_Sorted(int *array, int length)
{
int temp;
int position = length-1;
int position_temp = length-1;
for(int i=length-1; i>0; i--)
{
bool ischanged = false;
for(int j =0; j<position; j++)
{
if(array[j]>array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
ischanged = true;
position_temp = j;
}
}
position = position_temp;
if(!ischanged)
{
return ;
}
}
}
四:原始碼【測試用】
#include <bits/stdc++.h>
using namespace std;
void Bubble_Sorted(int *array, int length)
{
int temp;
int position = length-1;
int position_temp = length-1;
for(int i=length-1; i>0; i--)
{
bool ischanged = false;
for(int j =0; j<position; j++)
{
if(array[j]>array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
ischanged = true;
position_temp = j;
}
}
position = position_temp;
if(!ischanged)
{
return ;
}
}
}
void Init_Array(int *array,int length)
{
for(int i = 0; i<length; i++)
{
(array)[i] = rand()%100;
}
}
void Traverse(int *array, int length)
{
for(int i = 0; i<length; i++)
{
cout << array[i] << endl;
}
}
int main()
{
srand(unsigned(time(NULL)));
int array[20];
int length = 20;
Init_Array(array,length);
Bubble_Sorted(array,length);
Traverse(array,length);
return 0;
}
****************************************************************************************************************************************
最快的腳步不是跨越,而是繼續,最慢的步伐不是小步,而是徘徊。
****************************************************************************************************************************************