[洛谷]C++學(xué)習(xí)--算法--基本排序--冒泡法
[洛谷]C++學(xué)習(xí)--算法--基本排序--冒泡法
本蒟蒻又雙?叒叕來寫教程啦!

排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括:


關(guān)于時(shí)間復(fù)雜度
平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。
線性對數(shù)階 (O(nlog2n)) 排序 快速排序、堆排序和歸并排序;
O(n1+§)) 排序,§ 是介于 0 和 1 之間的常數(shù)。 希爾排序
線性階 (O(n)) 排序 基數(shù)排序,此外還有桶、箱排序。
關(guān)于穩(wěn)定性
穩(wěn)定的排序算法:冒泡排序、插入排序、歸并排序和基數(shù)排序。
不是穩(wěn)定的排序算法:選擇排序、快速排序、希爾排序、堆排序。
名詞解釋:
n:數(shù)據(jù)規(guī)模
k:"桶"的個(gè)數(shù)
In-place:占用常數(shù)內(nèi)存,不占用額外內(nèi)存
Out-place:占用額外內(nèi)存
穩(wěn)定性:排序后 2 個(gè)相等鍵值的順序和排序之前它們的順序相同

了解了排序算法的基本理念,現(xiàn)在我們來看一下十大基本算法:
1、冒泡排序
2、選擇排序
3、插入排序
4、希爾排序
5、歸并排序
6、快速排序
7、堆排序
8、計(jì)數(shù)排序
9、桶排序
10、基數(shù)排序

本篇文章講算法-----冒泡法

1.1 冒泡排序
冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?jīng)由交換慢慢"浮"到數(shù)列的頂端。
作為最簡單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書里出現(xiàn)的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優(yōu)化算法,就是立一個(gè) flag,當(dāng)在一趟序列遍歷中元素沒有發(fā)生交換,則證明該序列已經(jīng)有序。但這種改進(jìn)對于提升性能來
說并沒有什么太大作用。
1. 算法步驟
比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
針對所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè);
對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對,這樣在最后的元素應(yīng)該會是最大的數(shù);
針對所有的元素重復(fù)以上的步驟,除了最后一個(gè);
重復(fù)前面的三步驟,直到排序完成。
2. 動圖演示

3. 什么時(shí)候最快
當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí)(都已經(jīng)是正序了,我還要你冒泡排序有何用啊)。
4. 什么時(shí)候最慢
當(dāng)輸入的數(shù)據(jù)是反序時(shí)(寫一個(gè) for 循環(huán)反序輸出數(shù)據(jù)不就行了,干嘛要用你冒泡排序呢,我是閑的嗎)。
5.代碼實(shí)現(xiàn)
這里因?yàn)槭荂++系列教程,所以只展示C++的代碼
改進(jìn)版

本文到此結(jié)束了,記得點(diǎn)贊投幣哦!
文獻(xiàn)來源https://www.runoob.com/w3cnote/bubble-sort.html