排序總結系列一:冒泡排序

 冒泡排序步驟:設數組長度爲N
1.比較相鄰的前後二個數據,如果前面數據大於後面的數據,就將二個數據交換。
2.這樣對數組的第0個數據到N-1個數據進行一次遍歷後,最大的一個數據就“沉”到數組第N-1個位置。
3.N=N-1,如果N不爲0就重複前面二步,否則排序完成。
//冒泡排序1
void bubbleSort1(int *arr,int len)
{
	for (int i = 0; i < len; i++)
	{
		for (int j = i+1;  j < len; j++)
		{
			if (arr[i] > arr[j])
			{
				int temp = arr[i];
				arr[i]   = arr[j];
				arr[j]   = temp;
			}
		}
	}
}
//冒泡排序2
void bubbleSort2(int *arr, int len)
{
	for (int i=0; i < len; i++)
	{
		for (int j=1; j<len-i; j++)
		{
			if (arr[j-1] > arr[j])    Swap(arr[j-1], arr[j]);
				
		}
	}
}

//冒泡排序3
//優化:設置一個標誌,如果這一趟發生了交換,則爲true,否則爲false。如果有一趟沒有發生交換,說明排序已經完成
void BubbleSort3(int *arr, int len)
{
	bool flag = true;
	while (flag)
	{
		flag = false;
		for (int j = 1; j < len; j++)
		{
			if (arr[j-1] > arr[j])
			{
				Swap(arr[j-1], arr[j]);
				flag = true;
			}
		}
		len--;
	}
}
//冒泡排序4
進一步的優化:如果有100個數的數組,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置必定小於10,且這個位置之後的數據必定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就可以了。
<pre name="code" class="cpp">void BubbleSort4(int a[], int n)
{
	int flag = n;
	while (flag > 0)
	{
		n = flag;
		flag = 0;
		for (int j = 1; j < n; j++)
		{

			if (a[j-1] > a[j])
			{
				Swap(a[j-1], a[j]);
				flag = j;
			}
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章