冒泡排序的C、C++實現


一、冒泡排序

冒泡排序就是重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如數字從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。

這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。

冒泡排序算法的原理如下:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
  3. 針對所有的元素重復以上的步驟,除了最后一個。
  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

二、排序過程

如需要排序的元素為 88,1,59,105,9,2,8,15,6,10 ,將需要排序的元素按照從小到大依次排序,接下來一步一步分析使用冒泡排序對這些元素進行排序的過程。

  1. 排序前: 88 1 59 105 9 2 8 15 6 10
  2. 經過第一輪排序 1 59 88 9 2 8 15 6 10 105
  3. 經過第二輪排序 1 59 9 2 8 15 6 10 88 105
  4. 經過第三輪排序 1 9 2 8 15 6 10 59 88 105
  5. 經過第四輪排序 1 2 8 9 6 10 15 59 88 105
  6. 經過第五輪排序 1 2 8 6 9 10 15 59 88 105
  7. 經過第六輪排序 1 2 8 6 9 10 15 59 88 105

以上就是冒泡排序的整個排序過程,經過六輪排序之后所有排序已經完成。

三、程序實現

1、不設置元素位置交換標志位。
#include<iostream>
using namespace std;

const int BUFFSIZE = 10;
int Bubble_Sort(int Arr[]);
int main()
{
	int Arr[BUFFSIZE] = { 88,1,59,105,9,2,8,15,6,10 };  // 待排序元素
	Bubble_Sort(Arr) //排序
	return 0;
}

int Bubble_Sort(int Arr[])
{
	int Counts = BUFFSIZE - 1; // 排序總輪數
	for (int i = 0; i < Counts; i++)
	{
		for (int j = 0; j < Counts - i; j++) 
		{
			if (Arr[j] > Arr[j + 1])
			{
				int tmp = Arr[j + 1];
				Arr[j + 1] = Arr[j];
				Arr[j] = tmp;
			}
		}
        //每一輪排序后輸出元素順序
		for (int i = 0; i < BUFFSIZE; i++)
		{
			cout << Arr[i] << " ";
		}
		cout << endl;
	}

	return 0;
}

程序輸出:

1 59 88 9 2 8 15 6 10 105
1 59 9 2 8 15 6 10 88 105
1 9 2 8 15 6 10 59 88 105
1 2 8 9 6 10 15 59 88 105
1 2 8 6 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105  // 在第六次的時候已經排序完成
1 2 6 8 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105

由程序輸出可以看出,在第六次的時候已經排序完成,后面幾次都沒有元素交換,也就是說后面幾次其實是無意義的。這樣我們可以改進一下排序算法,設置一個元素位置交換標志位記錄本次排序是否有元素位置發生變化,如果沒有則認為排序已經完成,程序不需要再繼續執行,改進后的程序如下。

2、改進排序算法,設置元素位置交換標志位。

#include<iostream>
using namespace std;

const int BUFFSIZE = 10;
int Bubble_Sort_r(int Arr[]);

int main()
{ 
	int Arr2[BUFFSIZE] = { 88,1,59,105,9,2,8,15,6,10 }; // 待排序元素
	Bubble_Sort_r(Arr2); // 排序	
	return 0;
}

int Bubble_Sort_r( int Arr[])
{
	bool SwapFlag = true;  // 標志位,記錄每次排序是否有元素位置交換
	int Counts = BUFFSIZE - 1;
	for (int i = 0; i < Counts&&SwapFlag!=false; i++)  // 如果上次排序元素位置未改變,則排序完成。
	{
		SwapFlag = false; // 每次排序前,標志位復位
		for (int j = 0; j < Counts - i; j++)
		{
			if (Arr[j] > Arr[j + 1])
			{
				SwapFlag = true;  //發生位置交換,標志位置位
				int tmp = Arr[j + 1];
				Arr[j + 1] = Arr[j];
				Arr[j] = tmp;
			}
		}
		for (int i = 0; i < BUFFSIZE; i++)
		{
			cout << Arr[i] << " ";
		}
		cout << endl;
	}

	return 0;
}

程序輸出:

1 59 88 9 2 8 15 6 10 105
1 59 9 2 8 15 6 10 88 105
1 9 2 8 15 6 10 59 88 105
1 2 8 9 6 10 15 59 88 105
1 2 8 6 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105  // 在第六次的時候已經排序完成
1 2 6 8 9 10 15 59 88 105  // 第七次標志位沒有置位,發現排序已經完成


免責聲明!

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



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