重溫一下各種排序演算法

2021-04-03 02:39:54 字數 2462 閱讀 5394

最近打算用一些併發的模型研究一下排序演算法.所以,我首先回顧了一下各種排序演算法,並將它們用c語言實現了.

氣泡排序

基本思想:

先取第乙個元素,將它與後面n-1個元素比較,將n個元素中最小的移到首部.

接著,忽略第乙個元素,取第二個元素,將它與後面的n-2個元素比較,將n-1個

元素中最小的移到位置2.依此類推,直至第n個元素.

1.list->r[1..n]

2.for i:1 to n do

3.for j:i to n do

4.if r[i]>r[j] then

5.swap(r[i],r[j])

6.end if

7.end for

8.end for

源**:

void bubble_sort(int r,int start,int end)}}

}選擇排序

基本思想:

對待排序的記錄序列進行n-1遍處理,第i遍處理將r[i..n]中最小的元素與r[i]

將換.這樣,i遍處理後,前i個元素已經是正確的了.

1.list->r[1..n]

2.for i:1 to n-1 do

3.minpos:=i

4.for j:i to n do

5.if r[j]源**:

void selection_sort(int r,int start,int end)

else

}else}}

void buildheap(int r,int start,int end)

}void heap_sort(int r,int start,int end)

}快速排序

基本思想:

快速排序的基本思想是基於分治策略的.對於輸入的子串行r[p..r],如果規模足夠小則直

接進行排序,否則分三步處理:

分解:將輸入的序列r[p..r]劃分成兩個非空子序列r[p..q]和r[q+1..r],使r[p..q]中任一

元素的值不大於r[q+1,r]中任一元素的值.

遞迴求解:通過遞迴呼叫快速排序演算法分別對r[p..q]和r[q+1..r]進行排序.

合併:由於對分解出的兩個子串行的排序是就地進行的,所以在r[p..q]和r[q+1..r]都排好

序後不需要執行任務計算r[p..r]就已排好序.

1.list->r[1..n]

2.if n-1<=12 then

3.insertion_sort(r,p,h)

4.return

5.end if

6.q:=partition(p,h,r)

7.quick_sort(p,q,r)

8.quick_sort(q+1,h,r)

partition實現思想

1.在r[p..h]中選擇乙個支點元素pivot(隨機選擇的平均效能最好)

2.對r[p..h]中的元素進行整理,使得r[p..h]分為兩部分r[p..q]和r[q+1..h],並且r[p..q]

中的每乙個元素的值不大於pivot,r[q+1..h]中的每乙個元素的值不小於pivot,r[p..q]和

r[q+1..h]中的元素並不要求排好序.

1.list->r[1..n]

2.position:=(n+1)/2

3.pivot:=r[position]

4.for i:1 to n do

5.if ipivot then

7.tmpstore:=r[i]

8.for j:i+1 to position do

9.r[j-1]=r[j]

10.end for

11.r[position]=tmpstore

12.position:=position-1

13.end if

14.end if

15.if i>position then

16.if r[i]源**:

int partition(int r,int start,int end)

r[position]=tmpstore;

position=position-1;

i--; /* in case of two continuous larger number */}}

else if(i>position)

r[position]=tmpstore;

position=position+1;}}

}return position;

}void quick_sort(int r,int start,int end)

q=partition(r,start,end);

quick_sort(r,start,q);

quick_sort(r,q+1,end);

}若只算時間複雜度,以快速排序和堆排序為佳.為o(nlogn).

把這些東西重溫一下,並程式設計實現,保留乙個副本在這裡,以備不時之需.

各種排序的實現 求人解惑一下

include include include include include using namespace std define t 1000 bool cmp int a,int b 重寫sort 的比較函式 void swap int a,int b 直接插入排序 void insertso...

總結一下快速排序演算法

使用快速排序演算法將陣列中的數從小到大排序 先取陣列第乙個數作為key,陣列第乙個位置為first,陣列最後乙個元素作為last,last先和key比較,如果比key小,就把last放到first的位置。如果比key大,那麼last將減一,直到last的位置所在的數比key小,然後把last所在的位...

對比一下陣列排序演算法效率

乙個讓很多人糾結的問題 用什麼排序演算法 好。還有什麼穩定,非穩定的一堆問題。今天閒著,拿幾個演算法測了一下,報個結果給大家。首先先放出測試主 檔案 裡面包括有冒泡 快速 插入 雞w酒等排序 為了讓結果準些,我隨機生成了9999長度的大陣列進行排序 gt gettimer quicksort arr...