Java排序演算法之氣泡排序

2021-08-03 23:04:47 字數 3728 閱讀 9848

基本處理思想是通過對相鄰兩個資料的比較及其交換來達到排序的目的。

首先,將 n 個元素中的第乙個和第二個進行比較,如果兩個元素的位置為逆序,則交換兩個元素的位置;進而比較第二個和第三個元素關鍵字,如此類推,直到比較第 n-1 個元素和第 n 個元素為止;

上述過程描述了起泡排序的第一趟排序過程,在第一趟排序過程中,我們將關鍵字最大的元素通過交換操作放到了具有 n 個元素的序列的最乙個位置上。

然後進行第二趟排序,在第二趟排序過程中對元素序列的前 n-1 個元素進行相同操作,其結果是將關鍵字次大的元素通過交換放到第 n-1 個位置上。一般來說,第 i 趟排序是對元素序列的前 n-i+1 個元素進行排序,使得前 n-i+1 個元素中關鍵字最大的元素被放置到第 n-i+1 個位置上。排序共進行 n-1 趟,即可使得元素序列按關鍵字有序。

package com.algorithm.sorting;

/** * 氣泡排序

*@author administrator

* */

public

class

bubblesort

system.out.println("");

int temp;// 臨時變數

for (int i = 0; i < arr.length - 1; i++)

}system.out.print("第" + (i + 1) + "次排序結果:");

for (int a = 0; a < arr.length; a++)

system.out.println("");

}system.out.print("最終排序結果:");

for (int a = 0; a < arr.length; a++)

}public

static

void

main(string args) ;

bubblesort(array);

}}

首先看正序的整個過程:

要排序的陣列:100  20  30  -1  99  53  

第1次排序結果:-1 100 20 30 53 99

第2次排序結果:-1 20 100 30 53 99

第3次排序結果:-1 20 30 100 53 99

第4次排序結果:-1 20 30 53 100 99

第5次排序結果:-1 20 30 53 99 100

最終排序結果:-1 20 30 53 99 100

再看逆序的整個過程:

要排序的陣列:100  20  30  -1  99  53  

第1次排序結果:100 99 20 30 -1 53

第2次排序結果:100 99 53 20 30 -1

第3次排序結果:100 99 53 30 20 -1

第4次排序結果:100 99 53 30 20 -1

第5次排序結果:100 99 53 30 20 -1

最終排序結果:100 99 53 30 20 -1

演算法執行過程(正序):

空間效率:僅使用乙個輔存單元(temp)。

時間效率:假設待排序的元素個數為 n,則總共要進行 n-1 趟排序,對 j 個元素的子序

列進行一趟起泡排序需要進行 j-1 次關鍵字比較。由此,起泡排序的總比較次數為 ∑i

=nn(

j−1)

=(n)

(n−1

)2∑ i=

nn(j

−1)=

(n)(

n−1)

2因此,起泡排序的時間複雜度為o(

n2) ο(n

2)

。在計算機資源中,最重要的就是時間與空間。評價乙個演算法效能的好壞,實際上就是評價演算法的資源占用問題。

一旦去掉表示演算法執行時間中的低階項和首項常數,就稱我們是在度量演算法的漸進時間複雜度(漸進時間複雜度(asymptotic complexity) ),簡稱 時間複雜度.

為了進一步說明演算法的時間複雜度,定義 ο、ω、θ符號。

ο符號比如時間複雜度為 o(

n2) ο(n

2)

這個符號可以解釋為:只要當排序元素的個數大於某個閾值n時,那麼對於某個常量c > 0,執行時間最多為cn2

n

2。也就是說ο符號提供了乙個執行時間的上界。

ω符號ο符號給出了演算法時間複雜度的上界,而ω符號在執行時間的常數因子範圍內給出了時間複雜度的下界。

ω符號可以解釋為:如果輸入大於等於某個閾值 n,演算法的執行時間下限是 f(n)的 c 倍,其中 c 是乙個正常數,則稱演算法的時間複雜度是ω(f(n))的。ω的形式定義與ο符號對稱。

θ符號ο符號給出了演算法時間複雜度的上界,ω符號給出了時間複雜度的下界,而θ給出了演算法時間複雜度的精確階。

θ符號可以解釋為:如果輸入大於等於某個閾值n,演算法的執行時間在下限c1

c

1f(n)和上限 c2

c

2f(n)之間(0c

1≤c2

c

2),則稱演算法的時間複雜度是θ(f(n))階的。

我們評價演算法的執行時間是通過分析在一定規模下演算法

執行基本操作的次數來反映的,並且由於我們只對大規模問題的執行時間感興趣,所以是使

用演算法的漸進時間複雜度 t(n)來度量演算法的時間效能的。ο、ω、θ符號分別定義了時間復

雜度的上界、下界以及精確階。

演算法使用的空間定義為:為了求解問題的例項而執行的操作所需要的儲存空間的數目,但是它不包括用來儲存輸入例項的空間。

方案:

設定標誌位flag,如果發生了交換flag設定為true;如果沒有交換就設定為false。

這樣當一輪比較結束後如果flag仍為false,即:這一輪沒有發生交換,說明資料的順序已經排好,沒有必要繼續進行下去。

優化後的原始碼

/*

* 優化後寫法

*/public

static

void

bubblesort1(int arr)

system.out.println("");

int temp;//臨時變數

boolean flag;//是否交換的標誌

for(int i=0; i1; i++)

}if(!flag) break;

system.out.print("第" + (i + 1) + "次排序結果:");

for (int a = 0; a < arr.length; a++)

system.out.println("");

}system.out.print("最終排序結果:");

for (int a = 0; a < arr.length; a++)

}

優化後的排序過程:

要排序的陣列:100  20  30  -1  99  53  

第1次排序結果:100 99 20 30 -1 53

第2次排序結果:100 99 53 20 30 -1

第3次排序結果:100 99 53 30 20 -1

最終排序結果:100 99 53 30 20 -1

java 排序演算法之氣泡排序

氣泡排序是一種最基礎也是最簡單的排序演算法,它是一種穩定排序演算法,其平均時間複雜度為o n2 on2 空間複雜度為o 1 o1 是一種原地排序演算法。氣泡排序的思想其實很簡單,就是從最後乙個元素開始,依次與其前面的元素作比較,如果位置錯誤就交換位置,否則不採取操作,一直到第乙個元素,此時第乙個元素...

Java排序演算法之氣泡排序

package demosort 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。public class bubblesort int temp 0...

Java排序演算法之氣泡排序

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