冒泡排序

冒泡排序

簡介

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

原理

  1. 比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對全部的元素重複以上的步驟,除了最後一個。
  4. 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。
  5. 若是兩個元素相等,是不會再交換的, 相同元素的先後順序並無改變,因此冒泡排序是一種穩定排序算法。{時間複雜度爲o(n2)}

傳統的冒泡排序過程

​ 初始狀態:3 6 4 2 11 10 5c++

第一趟排序:3 4 2 6 10 5 11 (11沉到未排序序列)算法

第二趟排序:3 2 4 6 5 10 11 (10沉到未排序序列)數組

第三趟排序:2 3 4 5 6 10 11 (6沉到未排序序列)優化

第四趟排序:2 3 4 5 6 10 11 (5沉到未排序序列)spa

第五趟排序:2 3 4 5 6 10 11 (4沉到未排序序列)code

第六趟排序:2 3 4 5 6 10 11 (3沉到未排序序列)排序

代碼實現(傳統)

#include <iostream>
using namespace std;

int main()
{		 
	int a[7]={3,6,4,2,11,10,5};	
	int i,j,t;
	for(i=0;i<7;i++)//外層循環:要比較的次數
	{
		for(j=0;j<6-i;j++)//內層循環:每次比較時,要比較的元素的範圍;(這裏就至關於j<n-i-1 )
		{
			if(a[j]>a[j+1])//交換的三條語句
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	for(i=0;i<7;i++)
	cout<<a[i]<<' ';
	return 0;
}

冒泡排序-優化

定義一個flag,用來判斷有沒有進行交換,若是在某次內層循環中沒有交換操做,就說明此時數組已是有序了的,不用再進行判斷,這樣能夠節省時間。io

代碼實現(優化)

#include <iostream>
using namespace std;
int main()
{		 
	int a[7]={3,6,4,2,11,10,5};	
	int flag=1;
	int i,j,t;
	for(i=0;i<7 && flag;i++)//外層循環:要比較的次數
	{
		flag=0;
		for(j=0;j<6-i;j++)//內層循環:每次比較時,要比較的元素的範圍;(這裏就至關於j<n-i-1 )
		{
			if(a[j]>a[j+1])//交換的三條語句
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
				flag=1;
			}
		}
	}
	for(i=0;i<7;i++)
	cout<<a[i]<<' ';
	return 0;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息