「排序」在資料處理中經常都會看到,它作為資料結構和演算法中的重要組成部分,還是需要我們系統地進行學習。
對於排序的認知,我一直都處於就是對資料進行由大到小或者由小到大的排序,但具體是怎樣進行的,卻一直都沒辦法描述清楚,希望通過這次深入的學習,可以掌握更多關於排序的認知。
1.程式設計師內功:八大排序演算法1、排序的概念排序,其目的就是將一組「無序」的記錄序列調整為「有序」的記錄序列。2.排序演算法學習總結
它分為內部排序和外部排序。
若整個排序過程不需要訪問外存便能完成,則稱此類排序為內部排序。
反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序。
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 將相鄰元素進行比較和交換,簡單來說,第一輪排序時,內層比...
演算法系列 氣泡排序
在我們的生活中,撲克牌應該是每乙個人的娛樂專案之一吧。在我們玩撲克牌的過程中,我們也可以體會到學習的奧秘。我們會根據手裡的牌,從小到大進行排序 即小的牌在前面,大的牌在後面 在這個過程中,我們可以體會並學習氣泡排序的神奇。氣泡排序 臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣...