|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第七章,快速排序
* J/ I/ c" i* O+ n m0 |. ?" z9 C$ D# Z, `/ h7 }- O4 U9 t+ t& w
main( k9 B& n( F$ r7 x" X0 W9 t" T
- clear;clc
- A=[2 8 7 1 3 5 6 4]%测试数组
- A=QUICKSORT(A,1,length(A)); R# q8 H; Q. l7 E3 O, \7 U( F" y! v* C
L8 d1 w0 U/ z: T/ v2 `4 w
8 |# N! ]5 |/ p- [6 l- E6 D" w) [8 v L+ Z' d; u. J
QUICKSORT
0 A2 Q, i) A, \) k* l- function [A] = QUICKSORT(A,p,r)
- if p<r %还存在未排序的子数组
- [A q]=PARTITION(A,p,r);%以A(r)作为中间值来划分数组,中间值最后保存为A(q)
- A=QUICKSORT(A,p,q-1);%q的前半部分排序
- A=QUICKSORT(A,q+1,r);%q的后半部分排序
- end
- end
' O- }8 v; b+ L) D - D$ O" T3 k; w0 b& @2 ?
5 v+ ?7 W7 \$ Z
$ K8 ]8 Q8 z& r7 o' { A9 CPARTITION. K% s4 v- ?% a- m: u
- function [A,q] = PARTITION(A,p,r)
- flag=A(r);%A(r)为中间值
- q=p-1;%中间值q。可能末尾为最大值,则不存在分开两侧,所以从起始前一位置分段
- for j=p:r-1%起始值到(最后值的前一位)
- if A(j)<=flag
- q=q+1;
- temp=A(q);
- A(q)=A(j);
- A(j)=temp;
- end
- end
- q=q+1;%中间值的位置
- %交换
- temp=A(q);
- A(q)=A(r);
- A(r)=temp;
- end' Y% q) f' B9 Z/ m2 `' I
, r& S$ x$ e' L' _# `, d
$ d, e3 @$ A" [2 N1 w: W( l) Z3 F- c$ }; L$ H( D# A0 x
' v# {& \: T% b- F+ u1 W) J
|
|