1. 程式人生 > >C語言 - 氣泡排序【演算法優化】

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;
}

 

 

 

 

****************************************************************************************************************************************

 

             最快的腳步不是跨越,而是繼續,最慢的步伐不是小步,而是徘徊。
 

****************************************************************************************************************************************