1. 程式人生 > >關於氣泡排序的最簡單方法和進一步的優化

關於氣泡排序的最簡單方法和進一步的優化

        以前接觸過一些排序方法,對氣泡排序也有一定的瞭解。但是隻是為了記住而瞭解。此次重新學習了氣泡排序,發現自己當初學習的只是最簡單的氣泡排序演算法。急需進一步的優化。在此,我將自己最新學到的優化方法說出來和大家一起分享,也為了自己將來的鞏固學習。

          先來看最簡單的冒泡:

class Bubble_2
{
	public void bubble_2(int a[])
	{
		int temp;
		for(int i=0;i<a.length;i++)
		{
			for(int j=i+1;j<a.length;j++)
			{
				if(a[i]>a[j])
				{
					temp=a[j];
					a[j]=a[i];
					a[i]=temp;
				}
			}
		}
		
	}
	
}
              此處程式碼應該很好理解,如圖1:所示。這也是初學者先學習的一種排序方法。但是此演算法的效率非常低下,因為先排好序的關鍵字對後邊沒什麼幫助。還有可能將關鍵字較小者放在靠後的位置。急需改進。

          優化程式碼如下:

//優化,從尾部開始,將最小值向前移動
class Bubble_3
{
	public void bubble_3(int a[])
	{
		int temp;
		//外層迴圈的i表示陣列前面已經有序的個數。
		for(int i=0;i<a.length;i++)
		{
			for(int j=a.length-1;j>i;j--)
			{
				if(a[j]<a[j-1])
				{
					temp=a[j];
					a[j]=a[j-1];
					a[j-1]=temp;
				}
			}
		}
		
	}
	
}


         如圖2所示:此演算法的好處在於,排序時候從後邊開始,將較小者往前邊移動。這樣較小者會不斷往前移動。解決了第一個演算法,可能將較小者移到後邊的情況,提高了演算法效率。在上十萬條資料的排序過程中,這種差異將會體現出來。

             

如此看來,氣泡排序演算法似乎已經夠完美了?然而還可以進一步的優化。為什麼呢?

        因為如果待排序列為{2,1,3,4,5,6,7,8,9} 也就是說,除了第一個和第二個關鍵字需要交換外,別的已經有序。按照第二種演算法,演算法將會對每個迴圈中的j都會執行一遍,即使只有比較資料,並沒有交換資料。這個動作是大大多餘的,所以可以改進。如圖3所示:

      

        演算法改進可以使用最常用的辦法,那就是設定一個標記變數flag,當迴圈中沒有交換資料時,演算法將停止迴圈。執行結束。程式碼如下:

	 public static void bubble_4(int a[])  
	     {  
	         int temp;  
	        boolean flag=true;  
	         //外層迴圈的i表示陣列前面已經有序的個數。  
	         for(int i=0;i<a.length&&flag;i++)  
	         {  
	        	//將flag置為false  
	                flag=false; 
	            for(int j=a.length-1;j>i;j--)  
	            {  
	                  
	                if(a[j]<a[j-1])  
	                 {  
	                     temp=a[j];  
	                     a[j]=a[j-1];  
	                     a[j-1]=temp;  
	                     //若本次有交換髮生,則將flag重置為true  
	                     flag=true;  
	                       
	                 }  
	             }  
	         }
	         for(int x:a)
	 		{
	 			System.out.println(x);
	 		}	
	           
	    }  


        經過這樣的改進,演算法執行效率有了一定的提高,可以避免在已經有序的情況下的無意義的迴圈判斷。


分析兩種氣泡排序,程式碼如下:

排序1為從前面將資料挨個移到最後面。內層迴圈中,j<a.length-1-i是因為: -i是指陣列中後邊的i為已經有序,減去i可以減少比較次數。當然不減去i也可以搞定。

//氣泡排序1
 public static void bubble(int[] a)
 {
  boolean flag=true;
  //外層迴圈的i表示陣列後面已經有序的個數。
  for(int i=0;i<a.length&&flag;i++)
  {  
   flag=false; 
   for(int j=0;j<a.length-1-i;j++)      {
    
    if(a[j]>a[j+1])
    {
     int temp=a[j];
     a[j]=a[j+1];
     a[j+1]=temp;
     flag=true;
    }
   }
  }
  for(int x:a)
  {
   System.out.println(x);
  } 
 }


排序2將資料從後邊挨個移到最前面。內層迴圈中,j>i是因為:此處j>i而不是j>0可以減少比較次數,因為前面的i位已經有序。當然j>0也可以排序。

 //氣泡排序2
  public static void bubble_4(int a[])  
      {  
          int temp;  
         boolean flag=true;  
          //外層迴圈的i表示陣列前面已經有序的個數。  
          for(int i=0;i<a.length&&flag;i++)  
          {  
          //將flag置為false  
                 flag=false; 
             for(int j=a.length-1;j>i;j--)                  {  
                   
                 if(a[j]<a[j-1])  
                  {  
                      temp=a[j];  
                      a[j]=a[j-1];  
                      a[j-1]=temp;  
                      //若本次有交換髮生,則將flag重置為true  
                      flag=true;  
                        
                  }  
              }  
          }
          for(int x:a)
    {
     System.out.println(x);
    } 
            
     }  

相關推薦

關於氣泡排序簡單方法進一步優化

        以前接觸過一些排序方法,對氣泡排序也有一定的瞭解。但是隻是為了記住而瞭解。此次重新學習了氣泡排序,發現自己當初學習的只是最簡單的氣泡排序演算法。急需進一步的優化。在此,我將自己最新學到

氣泡排序簡單優化

1、氣泡排序為兩個相鄰的資料進行對比,然後根據排序規則,進行位置對換2、每次迴圈找出一個數字按照規則排序的位置,最小迴圈次數為n-1,n為陣列長度 如下為氣泡排序的一個程式碼實現 public static int[] bubbleSorted(int[] arr) { int le

Map按值的升序或降序排序簡單方法

使用jdk8的新特性private List<Map.Entry<String, Integer>> sortMap(Map<String, Integer> map, boolean asc) { Stream<Map.E

【iOS】物件陣列排序簡單方法

一個數組內是物件型別.想根據物件內的屬性進行排序. 很多人第一想到的是利用謂詞.其實陣列自帶了一個更簡便的方法便於我們進行排序 - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr NS_

Java對數組的操作(三)—比較兩個數組中的元素是否同樣的簡單方法

con data println test popu pan equal main spa 呵呵呵,實現Java比較兩個數組中的元素是否同樣的功能你是怎麽做的?看以下最簡單方法: import java.util.Arrays;

【轉】使用git將項目上傳到github(簡單方法

名稱 posit gitignore nor this strong 共享 window mas 原文地址:http://www.cnblogs.com/cxk1995/p/5800196.html 首先你需要一個github賬號,所有還沒有的話先去註冊吧! https:/

揭幕黑客軟件:如何盜別人的微信號密碼簡單方法及怎麽盜取微信密碼?

是我 之間 將他 微信 但是 因此 ima 信任 是不是 說真的作為一個白領,在生活中我有著一份不錯的工作,和老公是大學談戀愛的,四年之後,我們正式工作了,便順其自然的結婚。但是結婚之後,總是會擔心自己的老公會在外邊找其它的人,因此特別想要更好的了解對方。但是由於工作十分的

揭曉黑客步驟:盜微信號密碼簡單方法與軟件以及怎麽盜取微信密碼?

數字 讓其 方法 現在 防範 mage 最簡 不容易 快捷 揭曉黑客步驟:盜微信號密碼最簡單方法與軟件以及怎麽盜取微信密碼? 隨著信息時代的來臨,很多人使用上了微信,微信的出現使得人們的生活變的十便利。人們不僅在工作中使用它,在社交中也讓其發揮了重要的作用。微信現在已經漸漸

使用git將專案上傳到github(簡單方法) - 轉

方法如下 https://www.cnblogs.com/cxk1995/p/5800196.html   唯一需要注意的地方: 紅線框起來的地方,一定要改成"first commit"   或者其他內容,例如 git commit  

氣泡排序的拓展方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 氣泡排序的重複記憶 { &

C 建立快捷方式的簡單方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

anaconda+pycharm配置tensorflow-GPU環境簡單方法

2018年開始學習tensorflow框架。買了塊顯示卡1060 6G。裝上了原生的ubuntu16.04。從安裝顯示卡驅動到cuda和cudnn。無奈配置tensorflow環境一直報錯。之後轉回windows系統。試著繼續用網上說的命令列配置,還查了tensorflow的官方文件。還是報錯。

讓IIS8以上支援 WCF的簡單方法

原文地址:http://www.cnblogs.com/dudu/p/3328066.html   以前在IIS8中使用WCF時,總是參考在IIS8新增WCF服務支援這篇博文進行手工設定: 1. 首先新增MIME型別:副檔名“.svc”,MIME型別 “applicat

YouTube怎麼看視訊,解決如何開啟上YouTube簡單方法

不得不說YouTube是現在很新潮的一個視訊網頁,想看什麼都可以上這個上面搜尋一下但是使用過YouTube的人都知道這款軟體(網頁)是在國內不能正常開啟的, 開啟就是網頁走丟了 或者無法連線,請檢查網路 下面小編教你們一個正確開啟YouTune的辦法的 首先

git的簡單上傳 使用git將專案上傳到github(簡單方法

  使用git將專案上傳到github(最簡單方法)   首先你需要一個github賬號,所有還沒有的話先去註冊吧! https://github.com/ 我們使用git需要先安裝git工具,這裡給出下載

使用git將專案上傳到github(簡單方法

首先你需要一個github賬號,所有還沒有的話先去註冊吧! https://github.com/ 我們使用git需要先安裝git工具,這裡給出下載地址,下載後一路直接安裝即可: https://git-for-windows.github.io/ 1.進入Git

氣泡排序簡單問題(給名字分數 按總成績輸出最好的)

#include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; struct xs{ st

【C#】氣泡排序、隱式顯式轉換、函式及異常處理

一、普通氣泡排序: C#中常見的排序方法有:氣泡排序,快速排序,插入排序,選擇排序、堆排序以及歸併排序。雖然還沒學習過,但是也有耳聞,就先把它們先歸類。今天主要講這裡面最常見的氣泡排序。 【概念】 氣泡排序也就是講一組需要排序的數,進行從小到大,或從大到小的排列。計算機

python實現氣泡排序演算法的方法

list = [] print('你想排列幾個數?') try: num = int(input()) for i in range(num): a = int(inpu

MySQL索引使用方法效能優化

關於MySQL索引的好處,如果正確合理設計並且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。對於沒有索引的表,單表查詢可能幾十萬資料就是瓶頸,而通常大型網站單日就可能會產生幾十萬甚至幾百萬的資料,沒有索引查詢會變的非常緩慢。還是