1. 程式人生 > >排序演算法---氣泡排序

排序演算法---氣泡排序

參考網址:https://www.cnblogs.com/onepixel/articles/7674659.html 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。 演算法描述:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
  3. 針對所有的元素重複以上的步驟,除了最後一個;
  4. 重複步驟1~3,直到排序完成。 BubbleSort函式是氣泡排序基礎版 BubbleSort1是氣泡排序改進版,即雞尾酒排序,也叫定向氣泡排序,是氣泡排序的一種改進。此演算法與氣泡排序的不同處在於從低到高然後從高到低,而氣泡排序則僅從低到高去比較序列裡的每個元素。他可以得到比氣泡排序稍微好一點的效能。 程式碼如下:
#include<iostream>
using namespace std;
// 分類 -------------- 內部比較排序
// 資料結構 ---------- 陣列
// 最差時間複雜度 ---- O(n^2)
// 最優時間複雜度 ---- 如果序列在一開始已經大部分排序過的話,會接近O(n)
// 平均時間複雜度 ---- O(n^2)
// 所需輔助空間 ------ O(1)
// 穩定性 ------------ 穩定

void Swap(int arr[], int i, int j)
{
	int temp = arr[j];
	arr[j] = arr[i];
	arr[i] = temp;
}

//氣泡排序基礎版
void BubbleSort(int arr[], int n)
{
	if (arr == NULL)
	{
		cout << "陣列為空,無法排序!" << endl;
	}
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j]>arr[j + 1])  // 如果條件改成A[i] >= A[i + 1],則變為不穩定的排序演算法
			{
				Swap(arr, j, j + 1);
			}
		}
	}
}

//氣泡排序改進版
void BubbleSort1(int arr[], int n)
{
	int left = 0;                          // 初始化邊界
	int right = n - 1;

	while (left < right)
	{
		for (int i = 0; i < right-1; i++)  // 前半輪,將最大元素放到後面
		{
			if (arr[i]>arr[i + 1])
			{
				Swap(arr, i, i + 1);
			}
		}
		right--;

		for (int j = right; j > left; j--)  // 後半輪,將最小元素放到前面
		{
			if (arr[j] > arr[j + 1])
			{
				Swap(arr, j, j + 1);
			}
		}
		left++;
	}
}

int main()
{
	int arr[] = { 2, 3, 7, 9, 2, 1, 4, 6, 5 };
	int n = 9;
	BubbleSort1(arr, n);
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << endl;
	}
	return 0;
}