經典內部排序演算法有交換排序、插入排序、選擇排序、歸併排序、分配排序。
分類如下:
交換排序:氣泡排序、快速排序。
插入排序:直接插入排序、折半插入排序、希爾排序。
選擇排序:直接選擇排序、堆排序。
歸併排序
分配排序:基數排序、桶排序。
本博文將介紹交換排序。
一、氣泡排序
氣泡排序演算法的運作如下:
比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
void bubble_sort(int *arr,int len)
}}
演算法複雜度為o(n^2)。
二、快速排序
思想
快速排序採用的思想是分治思想。
快速排序是找出乙個元素(理論上可以隨便找乙個)作為基準(pivot),然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正 確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。
舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為
2 2 4 9 3 6 7 1 5 首先用2當作基準,使用i j兩個指標分別從兩邊進行掃瞄,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移
2 2 4 9 3 6 71 5 比較2和1,1小於2,所以把1放在2的位置
2 1 4 9 3 6 7 1 5 比較2和4,4大於2,因此將4移動到後面
2 1 4 9 3 6 7 4 5 比較2和7,2和6,2和3,2和9,全部大於2,滿足條件,因此不變
經過第一輪的快速排序,元素變為下面的樣子
[1] 2 [9 3 6 7 4 5]
之後,在把2左邊的元素進行快排,由於只有乙個元素,因此快排結束。右邊進行快排,遞迴進行,最終生成最後的結果。
快速排序函式,通過遞迴實現
void quick_sort(int *a,int low,int high)
return ;}/*
該函式返回分割點數值所在的位置,a為待排序陣列的首位址,
low剛開始表示排序範圍內的第乙個元素的位置,逐漸向右移動,
high剛開始表示排序範圍內的最後乙個位置,逐漸向左移動
*/int findposs(int *a,int low,int high)
{ int val = a[low];
while(low < high)
{ while(low=val)
high--;
a[low] = a[high];
while(low
演算法複雜度:平均o(nlgn),最壞o(n^2)。
內部排序之交換排序
快速交換排序簡介及其 冒泡交換排序及其 交換排序總結 我們知道假如乙個已排好序的陣列,假如是從小到大公升序排列,則隨便取其中乙個數n,則n左邊所有數都小於或等於n,右邊的都大於或等於n.那反向思維下,我們先隨便取陣列第乙個數為基準x,然後將所有小於它的數交換到左邊,大於它的數交換到右邊.最後x可能就...
經典排序之交換排序
交換排序的基本思想是 對待排序資料元素,兩兩比較其關鍵字,若發現存在逆排序,則交換這兩個資料,一直到待排序資料元素中沒有逆序為止。一 氣泡排序 bubble sort 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列 的工作是...
排序專題之交換排序
在交換排序這一類中,分為氣泡排序和快速排序,快速排序是建立在 氣泡排序基礎上的乙個優化,很有意義的乙個排序,在各種acm競賽 以及其他領域中經常被用到 接下來,我們先看一看氣泡排序。氣泡排序基本思想 通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上 漂浮 直至 水...