1. 前言
本節(jié)內(nèi)容是排序算法系列之一:冒泡排序赚哗,主要講解了冒泡排序的主體思路汇跨,選取了一個(gè)待排序的數(shù)字列表對冒泡排序算法進(jìn)行了演示脊另,給出了冒泡排序算法的 Java 代碼實(shí)現(xiàn)戚绕,幫助大家可以更好地理解冒泡排序算法塘娶。
2. 什么是冒泡排序归斤?
冒泡排序(Bubble Sort),是計(jì)算機(jī)科學(xué)與技術(shù)領(lǐng)域中較為簡單的一種排序算法刁岸。
它重復(fù)地遍歷要排序的序列脏里,會依次比較兩個(gè)相鄰的元素,如果發(fā)現(xiàn)兩個(gè)相鄰的元素順序錯(cuò)誤就把它們交換過來虹曙。遍歷序列的工作會重復(fù)地進(jìn)行直到?jīng)]有相鄰的元素需要交換位置迫横,也就是說序列的排序工作已經(jīng)完成。
冒泡排序的算法名稱的由來就是因?yàn)樵谂判虻倪^程中酝碳,按照排序規(guī)則(升序或者降序)矾踱,越小或者越大的元素會經(jīng)過交換之后慢慢 “浮” 到序列的頂端,就如同水中的氣泡一樣最終會浮到頂端一樣疏哗,所以起名為 “冒泡排序”呛讲。
3. 冒泡排序過程
在介紹完冒泡排序之后,我們一起來看一下冒泡排序的實(shí)現(xiàn)步驟具體是什么樣的吧返奉。這里我們假設(shè)待排序的序列為 [9,2,11,7,12,5]贝搁,我們按照從小到大的序列進(jìn)行排序。
3.1 算法步驟
- 步驟 1:
比較待排序序列中相鄰的兩個(gè)元素芽偏,如果發(fā)現(xiàn)左邊的元素比右邊的元素大雷逆,則交換這兩個(gè)元素;
- 步驟 2:
每一對相鄰的兩個(gè)元素重復(fù)步驟 1 的動作污尉,從左至右依次執(zhí)行膀哲;
- 步驟 3:
針對待排序序列中除了最右邊的一個(gè)元素之外,重復(fù)步驟 1被碗, 步驟 2 的工作某宪;
- 步驟 4:
持續(xù)以上步驟 1, 步驟 2蛮放, 步驟 3 的工作缩抡,每重復(fù)一次需要排序的序列中少一個(gè)最右邊的元素,直到?jīng)]有任何一對數(shù)字需要比較排序包颁。
其實(shí)瞻想,上面的步驟 2 每執(zhí)行一次,都有一個(gè)排序好的數(shù)字放到需要排序的序列的最右邊娩嚼,這樣一直重復(fù)蘑险,可以完成最開始的整個(gè)待排序序列的排序工作。接下來岳悟,讓我們用上面的待排序數(shù)字隊(duì)列 [9,2,11,7,12,5] 進(jìn)行整個(gè)算法步驟的排序演示工作佃迄。
3.2 算法演示
按照排序步驟泼差,首先我們會比較待排序序列中(9,2)這一對需要排序的序列,按照從小到大進(jìn)行排序呵俏,需要交換位置堆缘,形成序列(2,9),如下:
接著普碎,我們調(diào)用步驟 2吼肥,重復(fù)每一對的排序工作,整個(gè)過程如下:
步驟 2 會依次比較待排序序列中相鄰的兩個(gè)元素麻车,按照如上過程一樣缀皱。當(dāng)相鄰的兩個(gè)元素已經(jīng)是排序好的時(shí)候,無需交換順序动猬,否則交換相鄰兩個(gè)元素的順序啤斗。
Tips: 步驟 2 每執(zhí)行一次都會有一個(gè)元素排序好,就是所謂的冒泡的過程赁咙,按照從小到大的順序排列時(shí)钮莲,每次都會有一個(gè)最大的元素排序好,放在待排序序列的最右邊彼水。
完成步驟 2 之后臂痕,說明我們已經(jīng)把最大的一個(gè)元素 12 排序好啦,接下來我們只需要對序列 [2,9,7,11,5] 進(jìn)行排序即可猿涨,就如 步驟 3 描述一下,然后重復(fù) 步驟 1姆怪, 步驟 2 中的工作叛赚,具體過程執(zhí)行如下:
[圖片上傳失敗...(image-d29333-1651544329177)]
我們發(fā)現(xiàn)當(dāng)我們執(zhí)行 步驟 3 之后,之前的待排序隊(duì)列 [2,9,7,11,5] 中的最大的一個(gè)元素 11 又已經(jīng)排序好啦稽揭,接下來我們只需要調(diào)用 步驟 4 的工作俺附,重復(fù)之前 步驟 1, 步驟 2溪掀, 步驟 3事镣,這里我們就不在演示,只是重復(fù)性的進(jìn)行排序工作揪胃,每執(zhí)行一次 步驟 4璃哟,就已經(jīng)把一個(gè)元素排序好,待排序的序列中就減少了一個(gè)序列喊递,每次會有一個(gè)排序好的數(shù)字和一個(gè)剩下的待排序數(shù)列随闪。其實(shí),整個(gè)過程如下:
從上面的示例可以看出骚勘,其實(shí)整個(gè)冒泡排序的過程铐伴,每次都會把最大的一個(gè)數(shù)字排序出來撮奏,放在整個(gè)序列的最右邊,重復(fù)執(zhí)行整個(gè)過程当宴,直到整個(gè)序列中已經(jīng)沒有需要排序的數(shù)值了畜吊。
4. Java 代碼實(shí)現(xiàn)
在說明冒泡排序的整個(gè)過程之后,接下來户矢,我們看看如何用 Java 代碼實(shí)現(xiàn)冒泡排序算法玲献。
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
//初始化需要排序的數(shù)組
int array[] = {9,2,11,7,12,5};
//對需要排序的數(shù)組進(jìn)行排序
for (int i=1; i<array.length; i++){
//針對待排序序列中除了已經(jīng)排序好的元素之外,重復(fù)排序工作
for(int j=0;j<array.length-i;j++){
//當(dāng)相鄰兩個(gè)元素需要交換時(shí)逗嫡,交換相鄰的兩個(gè)元素
if(array[j]>array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
//打印出排序好的序列
System.out.println(Arrays.toString(array));
}
}
運(yùn)行結(jié)果如下:
[2, 5, 7, 9, 11, 12]
代碼中的第 8 行初始化一個(gè)需要排序的數(shù)組青自,后面按照從小到大的排序規(guī)則,實(shí)現(xiàn)了數(shù)組的排序驱证。第 11 行是外層循環(huán)延窜,不斷地重復(fù)排序工作。第 14 行是內(nèi)層循環(huán)抹锄,不斷地實(shí)現(xiàn)每一次 “冒泡” 逆瑞,將最大的一個(gè)元素找出。第 17 至第 21 行實(shí)現(xiàn)當(dāng)相鄰兩個(gè)元素需要交換時(shí)伙单,交換相鄰的兩個(gè)元素的功能获高。第 25 行打印出排序好的數(shù)組。
5. 小結(jié)
本節(jié)主要學(xué)習(xí)了冒泡排序算法吻育,在學(xué)完本節(jié)課程之后念秧,需要熟悉冒泡排序的算法流程,知道冒泡排序算法的實(shí)現(xiàn)思路布疼,可以自己用代碼實(shí)現(xiàn)冒泡排序算法