一、基本概念
冒泡排序是一種簡單的排序算法,通過不斷比較相鄰的元素,將較大的元素逐漸向後移動,從而使整個序列按照相應的順序排列。
冒泡排序的名稱來自於排序過程中較小的元素不斷「冒泡」到序列的頂端的比喻。
二、算法流程
冒泡排序的核心就是兩兩比較相鄰元素,如果順序不對就交換位置。每一次循環都可以確定一個位置,最終使得所有元素都排好序。
void bubbleSort(int arr[], int n)
{
for(int i = 0; i < n-1; i++) //n個數需要排序n-1次
{
for(int j = 0; j arr[j+1])
{
swap(arr[j], arr[j+1]); //交換位置
}
}
}
}
三、算法分析
1、時間複雜度:冒泡排序的基本操作是比較和交換兩個元素的位置,所以時間複雜度為O(n²)。
2、空間複雜度:冒泡排序是在原數組上進行排序,所以空間複雜度為O(1)。
3、穩定性:冒泡排序是穩定的算法,即在交換元素的時候,相同大小的元素不會改變它們的相對位置。
4、優化:
(1)加入標誌位提前結束循環。
void bubbleSort(int arr[], int n)
{
for(int i = 0; i < n-1; i++) //n個數需要排序n-1次
{
bool flag = false; //標誌位
for(int j = 0; j arr[j+1])
{
swap(arr[j], arr[j+1]);
flag = true; //發生交換,標誌位為true
}
}
if(flag == false) //沒有發生交換,提前結束循環
{
break;
}
}
}
(2)限制範圍提高效率。對於在某一趟排序中沒有發生交換的情況可以直接認為已經排列好了。因此,可以在每一趟排序後記住最後一次發生交換的位置last,下一輪排序只需要循環到last之前即可。
void bubbleSort(int arr[], int n)
{
int last = n-1;
for(int i = 0; i < n-1; i++) //n個數需要排序n-1次
{
bool flag = false;
for(int j = 0; j arr[j+1])
{
swap(arr[j], arr[j+1]);
flag = true;
last = j; //記錄位置
}
}
if(flag == false)
{
break;
}
}
}
四、應用場景
冒泡排序適用於小讀量的數據排序,但是時間複雜度較高,因此在大讀量數據排序的時候不建議使用。常用於幫助初學者理解排序思路以及簡單排錯。
五、總結
冒泡排序思想簡單,易於理解和實現,但是時間複雜度為O(n²),對於大數據量排序效率較低。可以通過加入標誌位和限制範圍的方法優化冒泡排序算法。對於初學者來說,冒泡排序可以作為學習排序算法的入門課程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/197257.html