排序算法 - 冒泡排序優化版


算法思想

冒泡排序分為趟數和交換次數。

外層循環為趟數,如果有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趟冒泡

比較的次數:

4c3dfcdd-e813-4e45-bf74-86453a9d8509

移動的次數:

45ca3388-44a3-4acc-bf6f-2a1dce04ebff

所以冒泡排序最好時間復雜度為O(n),最壞和平均為O(n^2)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM