快速排序和歸併排序(C語言)

2021-08-13 23:21:59 字數 2280 閱讀 9097

下屬專案

測試用例數量

快速排序無1

歸併排序無1

快速排序(我們以公升序為例)的關鍵在於:

把第乙個值看做是樞紐值(pivot),利用兩個座標把這個樞紐值傳到序列的合適位置,使得左邊的值均比樞紐值小,右邊的值均比樞紐值大對樞紐值左邊的序列(不包括樞紐值)做第一步的處理,對樞紐值右邊的序列也做第一步的處理。直至被處理的序列只有乙個數。

參考以下**:1

#include

#include

void

swap

(int

*a,int low,

int high)

//交換

intpartition

(int

*a,int low,

int high)

//尋找樞紐值

return low;

//當low=high時,座標即樞紐

}void

quicksort

(int

*a,int low,

int high)

//快速排序

void

main()

;quicksort

(a,0,9

);for(

int i =

0; i <

10; i++

)printf

("%d "

, a[i]);

system

("pause");

}

歸併排序(我們以公升序為例)的關鍵在於:

對整個序列等分,之後對左序列等分,對右序列等分,直至最後被等分的序列成為單個數。再從單個數開始不斷歸併(merge),歸併後的序列是有序的,這樣子的左序列和右序列再歸併還是有序的。

參考以下**:

#include

#include

void

merge

(int

*des,

int*src,

int size,

int low,

int mid,

int high)

//歸併

while

(low <= mid)

des[i++

]= src[low++];

while

(j <= high)

des[i++

]= src[j++];

}void

sort

(int

*des,

int*src,

int size,

int low,

int high)

//歸併排序

int*space =

(int*)

malloc

(size*

sizeof

(int))

;//開闢臨時空間

int mid =

(low + high)/2

;//等分

sort

(space, src, size, low, mid)

;//對左序列歸併排序

sort

(space, src, size, mid +

1, high)

;//對有序列歸併排序

merge

(des, space, size, low, mid, high)

;//把左序列和右序列歸併

free

(space);}

void

main()

;int b[10]

=;sort

(b, a,10,

0,9)

;for

(int i =

0; i <

10; i++

)printf

("%d "

, b[i]);

system

("pause");

}

快速排序和歸併排序其實都是分而治之,其中歸併排序不僅需要化整為零,還需要化零為整。2

如果本文對你有幫助,不如請我一罐可樂吧 ?

快速排序

歸併排序

程式基於王保明先生的講課內容. ↩︎

程式基於王保明先生的講課內容. ↩︎

c語言歸併排序和快速排序

老師要求做排序的課程設計,在網上找到的 看著不錯,收藏了 歸併排序和快速排序都是高效的排序演算法。快速排序 最壞情況下執行時間o n 2 平均執行時間o nlogn 不需要輔助空間。不穩定的排序。歸併排序 最好和最壞下,執行時間都為o nlogn 需要輔助空間,穩定的排序。實現 include in...

歸併排序和快速排序C

qquad 本文主要展示歸併排序和快速排序。快速排序和歸併排序為什麼可以將時間複雜度由其他演算法的o n 2 o n 2 o n2 降低到o n log2 n o nlog o nlog 2 n 快速排序的時間複雜度跟每次排序選取的元素在排序後陣列的位置有關,越靠近陣列中間,排序的速度越快。當每次元...

歸併排序和快速排序

歸併排序 先將問題分解為小問題即乙個個子序列,再將子串行按順序合併。class mergesort mergesort a,0 a.length 1 for int t a public static void mergesort int a,int m,int n public static vo...