# S& t! | B) e9 Qvoid BubbleSort(ElemType a[],int n){& O8 W2 r) Z5 o, V+ n
bool flag; 8 _7 K% V' s8 E7 `2 U4 C for (int i = 0; i < n-1; ++i) {9 h7 U$ @; v) [2 p/ j0 w: M
flag= false;; q" S( Z% z, ~8 n7 J
for (int j = 0; j < n-i-1; ++j) {( N+ L3 T( I. S0 g* P
if (a[j]>a[j+1]){ * }# C) l( e" m p int temp=a[j]; . z6 c4 b: B5 @& s( B* r a[j]=a[j+1]; # B6 V* S" }% d7 y a[j+1]=temp; : s5 R' V" t% U6 Q3 p flag=true; . X: D% U P( h! @# G2 p7 H } # C& d4 y$ A, t) F( j! i } ! \- _2 E% k: s. S, d" c! g if (!flag) + I! o1 K, }& f- b2 ]$ a$ ~ return;: ^/ \5 k9 S/ s
}6 H2 g$ |1 S* w1 A/ u4 r
}4 `! f/ N* l! N* y
. E9 q' q: `% X. a4 ~$ V3 p' ~( [
9 Q6 D9 ?' F* r# R7 J
int main(){ " R7 m7 T9 h6 m3 D4 e( H int n;( w& c- l- S% q+ }2 ?
ElemType a[n];6 j. A( H0 O9 J7 J! H
printf("一共有多少个数需要排序:");; V/ i7 Q7 o/ t* Z( w* |7 G
scanf("%d",&n); 3 s1 b7 J, F4 @2 G, D8 `( u printf("请输入%d个数:",n); ; Y( j, @4 n; o; r for (int i = 0; i < n; ++i) { 3 L/ `3 @9 ]! ^1 }( z( k; ] scanf("%d",&a); 1 g6 H7 L- k" V# P } . i9 s6 G, ^/ X1 r printf("排序后为:");- `3 Y/ r+ h# d& _ C1 Y
BubbleSort(a,n);1 W' O# ?/ N+ z) R' [& F* m
for (int i = 0; i < n; ++i) { + n* W" J1 r% b/ ?2 e printf("%d\t",a);0 \) y+ W* [4 D" m2 S
}3 ]0 m) P- y4 K r* c: y6 ~+ ] Y
} 1 e% x3 ?! Z0 I$ v) l( M. q# c) |7 I1 E4 \0 L
10 [ R6 I) e" `' s( F
2 ) u8 u6 n3 N$ l: P- d3% d7 {' e$ N' d! D B
4 2 u# [/ R7 W2 R2 r R4 @5 % f1 Q) y9 w. V) E, c69 n9 b5 _4 X+ W) m0 g
7/ z! ]2 ~9 x% t/ _" r% p
8 0 e- b' q& K2 [' w( m! a9 5 S# k8 l2 w; B) l+ Y* V+ k3 l; @10 9 t+ U- d) n/ |$ l6 [11 I& P& P H5 c/ B6 o% U4 p12- _' S* m& @8 a0 l. G4 Z
13" I% T. o5 q0 {" [3 |- }$ M: z- E
14 % v8 X3 X2 n9 W: U, F& r15 4 m5 N) L: |& t0 n4 ^' j16 q& R7 v; O1 f& l
17 1 J# D& x/ \, T$ H/ l) U185 y* }; `( e4 s/ U9 Y3 W
19 3 ~$ b" N5 ?& A7 f. m, \. T20 + }; K8 \+ m5 U7 c21( f" h4 s5 R) O$ Z1 I
22 - }! E1 O0 C* _8 b/ z236 D% ^% g2 T( ~- N8 T
24 3 X# D2 S2 \' n% H# r" I25& j [8 [, H9 N
26$ @: Y, J/ g0 V1 o
27 ( T: r8 R5 {! W# T28- ]1 g$ u2 t2 W }) h- w6 e
299 M: D! B1 @$ W2 r5 U: V
30 4 |. m* M" T" J8 g( v" X! F31 2 U8 |/ ~6 Z6 H5 z/ e |/ F, U32: A, a2 j! H3 h6 z! J; I* g
33 {, A& H" x& c& T- v) I1 B8 }" e34 J/ q+ V& x0 h" C6 x2 k+ {
35 {- ]/ [7 ]9 ]( H
36: U! D) n, {( x6 I5 ^& C6 X
377 ?& I" h! C3 D) j7 F
运行截图:/ W3 T6 X0 [0 s# a
/ z" f9 ~/ h. G" q: N( ?* T
! p+ H& ] n. K方法二:将最小元素交换到待排序列的第一个位置 ! n8 y8 L4 n' o6 ~6 ~7 _ 1 C3 p' O* L5 j* s& g7 H2 @# l#include "stdio.h" $ Z4 a" Z( g, p' }1 I * d; T7 b3 o" |& K1 }& d; x0 _* z0 Vtypedef int ElemType; % [% H. K) g; l# ~/ _8 ?; C7 h' C4 e# t$ e
void BubbleSort(ElemType a[],int n){ / @9 U0 D* r8 f% j bool flag; ) H. p+ D" E$ \' p- T0 u for (int i = 0; i < n-1; ++i) {" b$ z' f k# |" `4 Y& q' B7 @3 S
flag= false;4 `% _7 O, P( k; d1 V3 {, E
for (int j = n-1; j >i; --j) {( E# z- ^0 @+ ^, k6 [6 r8 L
if (a[j-1]>a[j]){ ( T* E( ~* l! Y' @! u- k2 \9 X int temp=a[j]; 1 o( Y, \7 ?0 W8 h# k a[j]=a[j-1];* s/ h# S- h% H% m# \5 H
a[j-1]=temp;; V4 I( _# N; c) u y! W' E# e
flag=true;! ^& Q, m8 b+ ^0 O" D, }
}4 z9 s( C V9 R) n" n
} ; k5 Q4 ~9 D" A- j5 \ if (!flag) & j( q) x' E- n; a. R! } return;" X6 y6 d0 v9 G, ^: X* z
} - C4 t* T/ V H2 x3 s}) }( x$ i$ e- m$ [
. Z) }! M. D( T' O+ b5 |, C4 J( M' i. T" U0 a6 j5 y5 t9 P- k
int main(){ % }! s. Q5 L0 O0 k9 B: d int n;5 G4 f8 d) z7 e# L6 [
ElemType a[n];0 [6 c' K1 @' [" L! M
printf("一共有多少个数需要排序:"); * U. |" ~! g% o5 I7 [9 r scanf("%d",&n);2 F9 Z4 H- O. z2 ^
printf("请输入%d个数:",n);1 L7 O0 r2 W& ]
for (int i = 0; i < n; ++i) { 1 Z. {* E0 z0 F. W* F1 H scanf("%d",&a); & Q! T8 D9 B1 C/ H1 Q, z } # {/ Z( @ M4 S3 B7 X7 ~/ G printf("排序后为:");+ u, k/ Y) j$ s
BubbleSort(a,n); # A* B/ n9 |1 H7 V* g/ a for (int i = 0; i < n; ++i) {. d1 P5 _" l. z9 ~" o- j$ `
printf("%d\t",a);3 @6 Q4 l# E( b
} & c* d' ~" D) @4 j- L$ w* I/ V9 U}$ @4 Y0 [. I- J, z1 p& ~+ q% F
" g s6 r8 z K: E" K
14 J$ N& |6 t G2 m" P% K
2& J) Q& \$ k, k8 s
3 ! L& l& L7 {& @: ^4- m8 [# e3 o2 a8 R
5% f& h; o: @) ^( n
6 % Y+ j1 o$ o) @8 M7 v9 j71 G4 ]9 H# v/ L( L+ L" B k0 d
84 f( ?3 o0 l/ W i) Q4 Q, u0 ^
98 R* A3 x- K, l$ j8 S: J: l
10. w9 W$ ~3 Y/ B9 k k S
11 9 K7 E2 q6 c, n9 X12 + N* A9 J% V$ V# K! K4 l13' [1 P6 G( H. R) U
14 [4 X; [$ D9 o' R4 u+ c1 \3 z6 }15* [5 W! V x) _9 b) e, J2 }7 j2 F; \
16 6 q, Q6 h# j* P7 C m. d170 j2 s1 I, C$ F' t1 g" O5 u& o
18# j3 b: @( a# M9 R+ w
19 $ c3 @' x- g3 ?7 Y5 |' Q207 B7 _: g- Y/ S k
21$ v( g% `: T0 R9 g$ O
22 ! o8 [% m8 ^" T$ v2 S, P232 ]3 t \+ M' y3 t2 p/ E
246 ]- J1 Q3 o& y
25 ( q# N! ]7 y' B* ^& x L26 O6 E) D: h) r; k/ v
27, b5 a5 j' y$ @, G
287 x% P0 `" u* y8 W
29) G5 t& _5 F5 u, Z
30 3 m( T# p" M2 Z, j) ]$ ^31% a F- S* g2 I0 k! l9 Y
32 6 i! S2 v( ~: y6 s33+ n' } [7 c4 v. N
34 & c. I! Y& W$ x2 ?4 {& n# t35 / r$ _0 _$ z9 P+ i! h$ P X36 5 f7 d7 O5 a7 B5 y37 1 p8 i$ F; y5 y( Y运行截图:. j/ ]- _- @. h0 F, A) B! r
- `4 j& ^; i1 c 7 M$ p' x) g/ [ s性能' E$ `) `% T7 u: {4 ~
8 w! Q/ V/ I& `空间效率: 仅使用了常数辅助单位,因而空间复杂度为O ( 1 ) O(1)O(1)/ S# O" s) o% Y6 A# t, _" I) V: S
3 V' u) x: ]7 @9 ^3 a2 }3 y% R
时间效率: 最坏情况:O ( n 2 ) O(n^2)O(n ) G3 Z0 S K8 M
2 ) u2 ]0 h9 A+ Z$ C$ Z* T) ^) Q );平均时间复杂度:O ( n 2 ) O(n^2)O(n 2 i* O6 N/ L: u' T" Y# n9 _6 f2: J! W# o& Q% a1 [7 j; P
); ^8 Y& O& }- J/ W) U
& T; `- Y$ q! m* h4 o. p
稳定性: 稳定 # e$ p( D! a0 b1 ]% m* t+ J+ h/ b: e1 \$ }6 ~$ r
适用性: 适用于线性表为顺序存储和链式存储。: x9 \- r* N0 B% J0 f
2 g3 B# q# y6 C! ]& x2.2 快速排序 ( Z) Z( O$ v9 `+ }图解(动图以后再补)2 b! L( ?2 L8 v O5 _1 v
第一趟的排序:/ h) T( X5 s; z
8 ~: B' D/ ]$ x ?( C# W第二趟:0 ~' S" v/ e0 S$ F
( U. F6 c5 Z1 x+ g第三趟: , m* I' O3 L' ` , A2 t! D) N5 ~6 |3 h( }- l/ r% H
基本思想/ l/ C' S" E2 C p2 N
* G1 s4 g/ _ {. {7 w3 p
快速排序的基本思想是基于分治法的:9 x0 b! S3 K2 M; w: \* J9 p
* `0 M% ^! Z: @! e: }
在数组a[0…n-1]中选取pivot:a[0] 作为枢轴(或基准,通常取首元素) ' O' i# D8 j' m; b: x; X通过对比排序,将pivot元素放置在k位置上,a[0…k-1]<pivot<a[k+1…n-1],完成第一趟排序。 ' f' _# y) b# i" p然后分别递归,将a[0…k-1]、a[k+1…n-1]子表按照1、2步骤排序。直至所有元素排序完成。4 B1 ^2 U; t4 K- m9 \6 { o: }. g
代码& v2 ]/ F6 d8 X% s
8 k, h/ }( v4 j: ^; A: p3 U
#include "stdio.h"2 `5 b( s$ j* c S. R3 g1 p
- J: {1 B6 C9 ktypedef int ElemType;. M" d6 X O. z# u2 W
3 {+ E4 }7 M1 J4 Q
int Partition(ElemType a[],int low,int high){7 p* Y! F$ }; O/ I8 d
ElemType pivot=a[low]; 7 u' I& x/ P8 e0 c: S" m, w6 P while(low<high){ ! N9 C6 ]4 k; e: T while (low<high&&a[high]>=pivot)--high;5 \" O, i4 X2 q' X3 i
a[low]=a[high]; $ o* D x- H/ ?2 I5 \5 K while (low<high&&a[low]<=pivot) ++low;$ l* R+ Z5 ~; \5 O& O. b# t6 I- E
a[high]=a[low];0 {2 R0 h: P0 u8 l
} 2 F+ z; B) U- f2 s' h a[low]=pivot; , `3 U6 D% L0 H2 n) \: I5 H+ C return low;; X. n- |' P7 u3 m! Y& y7 p4 V: t
}% e m U2 J* H; `% m
( T- G& X+ Z0 _( V4 j% A) lvoid QuickSort(ElemType a[],int low,int high){$ T) U% e+ Z& K( ?; J& C
bool flag; 8 s1 S) ^+ M0 f1 C9 o4 J _ if (low<high){0 P1 c/ v. @8 \" j
int pivotpos=Partition(a,low,high);8 r7 r- X. i9 `# ^7 C' d0 d) @
QuickSort(a,low,pivotpos-1);4 d' Q3 k0 J7 v/ d; T" [
QuickSort(a,pivotpos+1,high); ! z2 F) u, h! M }6 L$ i# y5 ^2 k# Z6 {
} 6 F! q7 r Y! ?. [ G' _+ Q& t% W , A8 Y) k6 m1 {1 gint main(){$ r. F/ {3 t& G' L2 [
int n; % l8 \! W, K4 { ElemType a[n]; $ `8 Z( z5 n K/ t& J/ ~ printf("一共有多少个数需要排序:");# g3 [/ f) l& f) j1 t8 m" V
scanf("%d",&n);6 A2 y: K: x8 b
printf("请输入%d个数:",n);# x H* x, f( S6 u8 e+ @
for (int i = 0; i < n; ++i) {+ G& E/ V3 m2 M2 B0 ~
scanf("%d",&a); 6 E3 |9 M+ A$ ~& t S6 E } 6 j9 v/ S1 q8 p" `. O3 } printf("排序后为:"); 3 A. s$ j8 [% p- m QuickSort(a,0,n-1);0 t# C2 @5 n. S! F, b
for (int i = 0; i < n; ++i) { + x0 v* Q& l) ^# b& k9 s printf("%d ",a); # {1 g- Z5 c a7 h1 c2 {! |, W" N. q8 M } ; l% z7 g# M; \( W. Y}) G2 n4 Z4 Q0 J" E
0 f9 S4 y6 d) T# V' t" m 9 w0 y: L" b$ P3 M( S" q, Q4 T1 + W/ L' a6 u% }) x' A( c6 R2 h2" A! y' g( n2 G: Y' ~% ~
3; }: \9 A5 G( F- @- H: T
4: Z+ C: j' y5 |# j
51 a; G0 s4 [1 }) S0 j4 B
6 : a; l7 R: g+ |7. f+ `* y1 E) t6 }' b6 b) u4 U
8" Q+ o' Y! e, S4 L' X- E; c. M
9 $ y5 X& i; X1 Z4 x8 G0 {# \10 - z5 Z" Z2 ] R( q8 x, q3 x11( z, x7 I P5 M; z7 b+ c: j
12, n' J" Z4 y O) R' {; v, U
13% r$ B4 A' p6 Q: H
14* K# w, e2 V6 z6 H/ d' g0 f* o' [3 x
151 k8 Q0 ]6 N, U ?- X& E
16 + n! H: `( s! \5 W. W17 , x# b1 h1 l" N! V6 e z3 A18; [) v& G4 W0 ~7 n* A- m
19& H: P W( k2 P) J
20 5 C6 P! k6 l6 D" `0 l- x. X! h21 ! ~- g4 ?3 I; [8 {5 Q220 ]% |# U7 j! \6 Z! \
23 ' | {5 h5 F9 m5 P6 [- j- M24: V* n" Q* w" d! K3 M: o
25, `' E% ]( y# U+ j6 {
26 $ i% h- C" n6 `: ]' C7 j275 `' T+ a( B5 {1 Q
28 , \" Q) N3 L/ m; E29# `; L# i$ F% Q2 L7 E3 W9 ^9 J% |
30; L7 }; _3 Z. ?2 Z4 a! L
311 J: _* g; E: @! d# ]
32 5 |; R% X: e- g% S& f: Z' W4 U33 ; |1 X# a+ e# A! P3 K& A34- k9 _( T' g3 U6 K* L3 |+ u$ C0 `
354 ]/ m0 C. }; P3 J M/ r) Z
36 * n7 A5 F# ]3 I7 q5 W374 c5 S* d0 V( Q1 r, r
380 O, p7 b( d2 a
390 A1 h' z) u1 N$ s* z' u( m9 P
40) E, B) g2 w, d5 n. h
416 h1 [* p" a5 f7 H1 L. {
性能 8 Z5 L( r0 u0 ~0 F% b8 e/ P# M# {* p3 j9 ]! n2 Z
时间复杂度和空间复杂度 * n8 V: l# u$ n7 e稳定性:不稳定. d" d3 k4 x# E/ ?6 O
! n2 y( E/ x3 x
3. 选择排序 2 s% n1 h5 v; c3 z- d4 z, E/ w3.1 简单选择排序3 w8 _; Q f" M) a& |; g
图解 / f) l6 [9 h+ x# S; i5 F$ T$ [- Y- }& `8 r4 {7 @
Q% o) M7 r+ G. A9 H基本思想 & y7 \8 q* P, Q `: N1 ^ J" N1 Y9 w' z$ `# r
在a[0…n-1]中,将a[0]设为最小元素,设min=0 / N) v0 h6 @8 P8 z. h在a[1…n-1]中找到小于a[0]的最小的元素a[k],令min=k;- H, g0 J" }3 ]1 ]6 t
若min=0,则a[0]最小,不用交换;若min!=0,则a[0]和a[k]进行交换,第一趟排序完成。, T0 H/ E1 |( b8 d: P7 E3 s2 O
在a[1…n-1]中继续进行排序。 % X3 `' c. ]) N) w3 l代码6 j/ P" f. ?4 G! B) |
O& v$ Y( r+ [+ n# b( P( L
#include "stdio.h" ; ~) F5 z& \) n) @1 k3 e% w; Q3 D' M1 B! L
typedef int ElemType; $ b) n0 K* _3 M- H' Z) k2 D3 a1 ]4 H) ]$ d
void SelectSort(ElemType a[],int n){ 6 `# k* h( X% ]3 \ s* h for (int i = 0; i < n-1; ++i) { 4 F% b) k# f. P8 g. w int min=i;# `+ ^/ X0 r1 g2 U
for (int j = i+1; j < n; ++j)4 N& E9 \& x( K& B3 G/ `2 q: L
if (a[j]<a[min])1 `; v( p1 L0 ?" j8 g, e! Z8 S6 |
min=j; 3 n* K; q7 i" ] A) m! d7 D if (min!=i){ 7 } T' a Z( R4 M# O2 Y int temp=a[min];- i1 r* h( s1 [8 [- R" v
a[min]=a; 9 j4 F. A. `, l4 C4 M a=temp; & Q6 [& G$ O$ e& e4 W" L3 z } / Y, [) x% ~( Q; y$ b0 { } 5 |8 P- N8 E5 e5 B/ G8 V. C C} ) _) v' I% ]( R5 s1 H; k7 f' v5 ?* ^5 H& R( D
int main(){2 s: d$ b, n! Z/ t
int n; f+ r+ v. [ Q4 i2 A, M0 A ElemType a[n]; : }9 `7 f' A o( u% R3 Y+ J printf("一共有多少个数需要排序:"); v J5 a# g {: k scanf("%d",&n); " o! A) l! Z0 B3 O( b% o. J printf("请输入%d个数:",n); 7 u! {( m% D# k! v for (int i = 0; i < n; ++i) {+ a8 M. `* a$ w3 C. m4 t
scanf("%d",&a); 3 x3 V5 [ S0 |, k) q6 ~8 {' B } z6 r$ g8 K j SelectSort(a,n);0 {& }5 r& ^+ T0 W S0 N% W- I" n
printf("排序后为:"); * ?/ J+ T2 Q' e( R, V for (int i = 0; i < n; ++i) { 1 v' u4 s+ n; j# v, g4 n7 m* a: r printf("%d ",a);+ @# R) D3 B G9 O! k
}7 v% r) a( }- h
}5 p* |$ f# w1 |* A' h
* Q/ v6 K; l* S! h. `1 ' V' F& x# \, Z0 B% f# y2/ i) k* u9 x+ O2 @) M
3 ) g5 D" n8 G' {$ J+ }+ `* l41 Y$ O: Y. f- E' |
56 y% H: X# p, w/ d' x+ N
6 ^. }1 b8 o1 T7 / l. R% c4 F' U. G0 S8 # ]* i8 K( }6 o( g5 D8 U9: _/ L& o# R& O) _. j( K3 @/ {
10 ) y- V, p3 k) L( p119 M4 V$ r" b B% }5 W* ?
121 X2 S; q; Z1 l. c0 F7 g
13 + x5 G( A. V& R( H) Q14 ( Q9 _5 W n/ ^/ X% T; Y/ T15 # R2 o5 B1 k% B. s" f9 ?; o162 [$ K; _* l6 q0 L+ l* K
17 ; ]) e( T$ }& c; E1 Q5 x F! R18. N! f2 s# l' g) w5 `5 b# u
19) O+ ^3 N# W! X6 g
20 # a! x$ [' s6 I5 Y7 y3 o7 a3 }211 @# L& Z1 `2 C9 E' G
22 0 y5 a& I* Z1 e. m3 y- X2 z. L+ D4 ^23( F' b, `1 f6 o( B8 h/ ]$ `) Q
24 ! F; h$ u5 A5 a) h7 e; U* G/ l- W# l( q25 # P9 q0 U9 v( d* {" {' w; k26* Y9 m1 g' S+ e; c* S
279 b* ` Y! h2 N. m2 v" {
283 e+ x* Y f% [8 O
29 " Z4 x! W0 \* {) @! Z30 ) S1 {$ [% c) n ^/ d% M317 I o, q; o( H5 @, x. g
32 7 Z+ G# W0 f) a6 `& O& H6 j) [33# `6 O. y& {, H( y4 {- k
性能 8 |' M: G0 q! s# b7 v! A8 r& f) ~' _' x5 }& Q$ M
空间复杂度:O ( 1 ) O(1)O(1)) @/ F4 i5 q4 E" C
时间复杂度:O ( n 2 ) O(n^2)O(n 8 R5 r# q3 ^* X) L% |2 5 j$ ~( ~! S- \% q6 U; z ) 1 r, a% e" s5 {稳定性: 不稳定- m' T4 `; f* e& Z
' X/ q6 L8 {9 o7 P
使用性:顺序表和链表都适用。4 K9 p& q$ `# }7 c
+ ?0 W7 b/ [2 k: W7 n
3.2 堆排序1 y/ K# W w' X0 p( Y" s
看堆排序的点击这里!!!!3 w# W8 B) [5 |% F5 |; X
# r- k; c5 o) t+ |' w, j' c: B
4. 归并排序和基数排序 , _7 M! @6 q+ F4.1 归并排序. `) W8 I% t8 n }$ N
图解 w+ _% \% Z% ~, W" ^9 I0 ^
2路归并排序 7 h# _- f0 M% n: t: d0 J9 F0 r1 P, I7 ]" a# H v3 B
$ d) o1 S: j1 ^0 O% }& T基本思想. l# e; d- u) ?
N0 k6 f. Q! G6 V% w- {' O! C2 q( i! ~将待排序列分成长度为1的子表,然后两两归并,形成有序子表 4 l V! z: X O1 U, [7 v: @: d8 X6 Z6 K. v$ x8 N
然后将子表再次进行归并,直到子表的长度=待排序表的长度。0 G s4 g; O ^1 d/ n5 r: u
代码( c- ]: W! }( s( \. R0 L, {
; j4 H3 t( i* q5 y$ z" d
#include "stdio.h" , s0 o' i0 x7 z0 B#include "stdlib.h" 3 e) L9 `7 O8 r7 T3 l8 `% T2 z
typedef int ElemType; . I5 s% d* t G. u2 ` " A% {. B5 }: b/ j2 p8 P- H/ xElemType *b;" t+ O, E U1 k( W: \+ \
1 ?7 J* g! S7 J% i& T
void Merge(ElemType a[],int low,int mid,int high){, H& M6 w4 ]6 l& t! `
int i,j,k; $ W* q0 ]5 S+ p+ k6 R+ i+ G, p for (int k = low; k <= high; ++k) {( H) C6 [" Y3 s: @: M$ Z
b[k]=a[k];* @0 E$ ^8 H2 r+ M9 t+ e. O
}5 J/ _ w- R1 \6 `
for (i=low,j=mid+1,k=i; i<=mid&&j<=high; k++) { + ]$ I6 \! V" e/ A9 [7 B if (b<=b[j]) a[k]=b[i++];. I4 W- O8 K( w8 m
else a[k]=b[j++]; " h# M2 K1 B& o; \+ x% d }2 ] b! m; t, ~- ]
while (i<=mid) a[k++]=b[i++]; ; O8 R3 M0 [! h, N while (j<=high) a[k++]=b[j++]; 9 I3 f$ I- e: H V} " y3 S# M2 Q. N) {8 x, R- { / C, U, l9 P. K$ h5 E3 Gvoid MergeSort(ElemType a[],int low,int high){ * h- {/ Q0 @ v if(low<high){9 Q I' b5 z% `$ O* o' @
int mid=(low+high)/2; N0 a7 s- \, Y) v
MergeSort(a,low,mid); 1 T) a+ w( W+ U MergeSort(a,mid+1,high);* x/ I0 j0 w* z& ^# L
Merge(a,low,mid,high); 2 h+ @; O: }' D" h3 Y# T }9 M# z) q! `" O
}+ Z. r. D: C- ~. h
8 E, i2 r* N7 a; n9 d. u
int main(){ & G) G3 ~4 R/ q int n; % N) ~/ [! c/ b. N' x ElemType a[n]; 6 h$ ~2 N6 j* H* y$ W b=(ElemType*) malloc((n+1)*sizeof (ElemType));( F; L7 O. w2 ]% V0 B+ z/ g
printf("一共有多少个数需要排序:");. v0 b+ ]7 \7 \
scanf("%d",&n); $ ~( w/ ~5 ^( ^) N1 ?: L printf("请输入%d个数:",n);) G( F0 s" M! n' Y7 Z( n/ X
for (int i = 0; i < n; ++i) {' P+ n/ q% H y, t
scanf("%d",&a); 5 a9 ~, {' d2 L; Y4 d; \+ l( ^ } - ]: W$ g" \* A0 F/ |. k- n, n MergeSort(a,0,n-1);7 }- B* ?7 E2 g. _6 _
printf("排序后为:"); 6 w+ u) c, P& T( \ for (int i = 0; i < n; ++i) {4 C) v5 X0 M; |: G( f2 w- f& T& F" @# k0 j
printf("%d ",a);! w% _2 V: C. }" V
} $ t$ b) o0 T; c}" f2 a. f1 U% _, G7 [ P0 x7 J
. K' Y- F' g1 t
7 \/ t8 M6 B% A- Q! y
1 " O- e! q0 A6 l- i4 P* X/ F2$ X+ N7 t7 M5 q% N
3 0 ^' ~. W8 Q. @9 |) X4 ' b. @* ?) K* r# d1 g3 i9 T( r50 O5 f$ }& \' o
6 1 _4 N; X) l: G6 `75 ]4 H) o3 A* p0 l
8 & D% J/ ~' p% Z+ B1 s9 - y4 `) ^4 Q4 H; [# a10 C4 ?" I; p! p! s2 i- s" O
11/ P1 c0 m: U) y# [1 V8 W
12% j4 O1 G4 y% c9 V, }
13 5 E' l M9 [1 }; M9 O14 * [2 t U" y2 m8 m8 Q15- W+ ^5 n+ A$ V( t
16 2 b5 w4 a y/ }& T& r173 `, a8 F1 }8 }# u9 |
18( f& \2 L6 ]; U; y9 z: _- p
19+ {% o) o) @5 k- J8 }, F2 K
20 # Y0 U& B( N( d" I+ i3 S21! V @$ D, Z! k4 h
22 * J. ~2 ]7 G" e. f23 ' Z& H9 r& J, q9 ~24! ]% }4 R, c$ c8 x3 A) ~* {
252 ^/ d5 l' n* O" n6 Z# t
26 2 R; M- M+ C5 M! m7 k27 , G5 m8 c9 `$ t, \) Q28 3 l& f5 v' { `; e3 p29 * I Z4 {# j1 _30 0 ~* z- f3 W S* p* m, K1 D ?! L317 r6 L! [' A1 s0 W
32- \/ `% L0 d$ s% {
33! D- u" f0 B5 t: b ?4 b
349 g/ T6 s, x* J6 J6 T, b
35 9 z; s- s u' U$ W/ `36 : U4 K$ ]6 u) T0 D. u7 ~+ p) Y37 1 C; G# M E4 D9 U3 g8 d" I# L38 c! z d7 a. n% l* U
39! k2 G5 ]2 P8 U' }
40% }% c3 C. m4 s1 q) z: Q3 A& d& |
41 5 g, q! f8 `: K% T! Q422 e- U" x% W4 l5 D
43 0 r4 n; N/ j5 |44 / q+ h2 O7 u% d, H' u& H: i45 , L C3 Y5 f4 A. v" v' ?8 y; Q46! z6 `$ ]) Q: B
性能$ b X6 H- {* a" G9 G# e
; `, ? ~" G/ P+ N2 w3 C9 f4 g( n
空间效率:O ( n ) O(n)O(n) 创建了一个数组b- @, b$ G t8 h& q! W5 |2 h8 b
时间效率:O ( n l o g k n ) O(nlog_kn)O(nlog & O: T7 ^: h" x8 Q
k ; {4 ~. N3 k5 ?; \) s, Q) B! b: d( ]; Z& u
n) k指k路归并排序。 ! _+ N# q# \5 |( u, f' H8 e7 P稳定性:稳定1 x* \2 X9 n2 T3 h6 p