演算法系列 排序演算法(1)氣泡排序

2021-08-15 16:17:20 字數 3047 閱讀 7908

「排序」在資料處理中經常都會看到,它作為資料結構和演算法中的重要組成部分,還是需要我們系統地進行學習。

對於排序的認知,我一直都處於就是對資料進行由大到小或者由小到大的排序,但具體是怎樣進行的,卻一直都沒辦法描述清楚,希望通過這次深入的學習,可以掌握更多關於排序的認知。

1.程式設計師內功:八大排序演算法

2.排序演算法學習總結

1、排序的概念排序,其目的就是將一組「無序」的記錄序列調整為「有序」的記錄序列。

它分為內部排序和外部排序。

若整個排序過程不需要訪問外存便能完成,則稱此類排序為內部排序

反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序

2、排序分類

八大排序演算法均屬於內部排序。如果按照策略來分類,大致可分為:交換排序、插入排序、選擇排序、歸併排序和基數排序。如下圖所示:

3、演算法分析

下表給出各種排序的基本效能:

下面開始各個演算法的學習,對於每種排序演算法,需要理解以下問題:

1、演算法思想是什麼

2、時間複雜度

3、穩定性

4、什麼情況下使用?

排序(1)氣泡排序

一、前言

氣泡排序是一種交換排序

交換排序就是兩兩比較待排序的關鍵字,並交換不滿足次序要求那對數,直到整個表都滿足次序要求為止。

二、演算法思想

從第乙個元素開始,重複走訪需要排序的數列,每次比較相鄰的兩個元素,若順序錯誤則進行交換,直到數列結束開始下一輪。

當數列中的元素全部遍歷之後排序完成,演算法結束。

這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端,故名「氣泡排序」。

時間複雜度:

o(n^2),改進後再最好情況下達到o(n)

穩定性:

穩定適用場景:

比較元素較少時都可以使用。

三、**

/*

排序(1)氣泡排序

time:2018-02-18

author:stella chen

content:

a ****** example about bubble sort

*/#include

#define n 10

int main() ;

int t;

printf("the original sequence:\n");

for (int i = 0; i < n; i++)

printf("%d ", ary[i]);

printf("\n\n");

//n-1輪完成排序

for (int i = 0; i < n-1; i++)

for (int i = 0; i < n; i++)

printf("%d ", ary[i]);

printf("\n");

}printf("排序結束:\n");

for (int i = 0; i < n; i++)

printf("%d ", ary[i]);

printf("\n\n");

}return

0;}

執行結果:

四、優化

從上面的例子可以看出來,當數列已經正序時,排序仍將繼續進行全掃瞄。所以,對氣泡排序的改進方法是加入**標誌性變數flag**,用於標記某一趟排序過程中是否有資料交換。

如果進行**某一趟排序時沒有進行資料交換,則說明所有資料已經有序**,可立即結束排序,避免不必要的比較過程。

從上面的例子可以看出來,當數列已經正序時,排序仍將繼續進行全掃瞄。所以,對氣泡排序的改進方法是加入**標誌性變數flag**,用於標記某一趟排序過程中是否有資料交換。

如果進行**某一趟排序時沒有進行資料交換,則說明所有資料已經有序**,可立即結束排序,避免不必要的比較過程。

****如下:**

//優化後,加入flag

#include

#define n 10

int main() ;

int t;

printf("the original sequence:\n");

for (int i = 0; i < n; i++)

printf("%d ", ary[i]);

printf("\n\n");

//n-1輪完成排序

for (int i = 0; i < n - 1; i++)

for (int i = 0; i < n; i++)

printf("%d ", ary[i]);

printf("\n");

}printf("排序結束:\n");

for (int i = 0; i < n; i++)

printf("%d ", ary[i]);

printf("\n\n");

if (flag)

break;

}return

0;}

執行結果:

排序演算法系列 氣泡排序

氣泡排序是是一種比較基礎簡單的演算法。它的原理是通過對比前後的元素大小,將較大的數換到後面的方式來實現排序 舉個例子 假如現在有乙個無序陣列disorder arr 4,2,19,10,1 第一步 取第0個元素4,和第1個元素2 對比,發現4比2大。第二步 交換4與2的索引。即第0個元素為2,第1個...

排序演算法系列 氣泡排序

對陣列array n 其陣列長度為n,元素索引0 n 1,對其進行公升序排序,針對n 10時,可選擇氣泡排序 氣泡排序要點 1.氣泡排序有兩層迴圈,外層迴圈用來計算有多少個數i不再需要比較,記憶體迴圈負責從index0 index n i 1 將相鄰元素進行比較和交換,簡單來說,第一輪排序時,內層比...

演算法系列 氣泡排序

在我們的生活中,撲克牌應該是每乙個人的娛樂專案之一吧。在我們玩撲克牌的過程中,我們也可以體會到學習的奧秘。我們會根據手裡的牌,從小到大進行排序 即小的牌在前面,大的牌在後面 在這個過程中,我們可以體會並學習氣泡排序的神奇。氣泡排序 臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣...