算法思想
冒泡排序分為趟數和交換次數。
外層循環為趟數,如果有n個元素則要循環n-1趟。
內層循環主要做每一趟的交換,從第0個元素開始如果發現當前元素大於它的后一個元素,將其交換,每一趟下來,最后一個元素都是最大的,所以每次循環只要循環到0~n-1-i即可,因為后面的元素就是有序的了。
算法代碼
void BubbleSort(int* arr,int size)
{
int k=size-1; //k用來記錄每趟排序的最大的交換位置
int pos=0; //pos記錄最后一次交換的位置
//排序的趟數,共size-1次
for(int i=0;i<size-1;i++)
{
//每一趟前都將flag標志先置為0
int flag=0;
//每一趟排序都是從0~k,k初始是size-1,之后隨着循環k值可能變化
for(int j=0;j<k;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=1; //元素發生了交換,flag置為1
pos=j; //pos存放循環里最后一次交換的位置j
}
}
k=pos; //下一內層循環僅循環到0到這次得到的k之間
//如果一趟下來flag沒有變化,即元素本來就是有序,就直接return
if(flag==0)
{
return;
}
}
}
此算法是冒泡排序的優化版算法,優化點:
1.如果本來就有序,第一趟就直接判斷然后return。
2.每一趟都是從0~k,可以記住上一趟排序時最后一次交換的位置k值,下一次的k值會更新,如果中間有幾個元素本來就有序,則k值記錄的是有序的前一個位置,則下一次循環就不用再循環這幾個元素,直接循環到記錄的k值那里即可,可以減少循環次數。
算法分析
最好的情況(關鍵字在記錄序列中正序):只需進行一趟冒泡
比較的次數:n-1
移動的次數:0
最壞的情況(關鍵字在記錄序列中反序):需進行n-1趟冒泡
比較的次數:
移動的次數:
所以冒泡排序最好時間復雜度為O(n),最壞和平均為O(n^2)。


