設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,然後將所有比它小的數都放到它左邊,所有比它大的數都放到它右邊,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。
假設一開始序列是:5,3,7,6,4,1,0,2,9,10,8。
此時,ref=5,i=1,j=11,從後往前找,第乙個比5小的數是x8=2,因此序列為:2,3,7,6,4,1,0,5,9,10,8。
此時i=1,j=8,從前往後找,第乙個比5大的數是x3=7,因此序列為:2,3,5,6,4,1,0,7,9,10,8。
此時,i=3,j=8,從第8位往前找,第乙個比5小的數是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。
此時,i=3,j=7,從第3位往後找,第乙個比5大的數是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。
此時,i=4,j=7,從第7位往前找,第乙個比5小的數是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。
此時,i=4,j=6,從第4位往後找,直到第6位才有比5大的數,這時,i=j=6,ref成為一條分界線,它之前的數都比它小,之後的數都比它大,對於前後兩部分數,可以採用同樣的方法來排序。
public
static
int[
]qsort
(int arr,
int start,
int end)
while
((i&&(arr[i]
((arr[i]
==arr[j])&&
(i)else}if
(i-1
>start) arr=
qsort
(arr,start,i-1)
;if(j+1
qsort
(arr,j+
1,end)
;return
(arr);}
public
static
void
main
(string[
] args)
;int len = arr.length-
1;
arr=
qsort
(arr,
0,len)
;for
(int i:arr)
}/*//方式二*/
更高效點的**:(textendscomparable和sortutil都是自己封裝的類,裡面重寫和實現了compareto和swap方法)
public
?supert>>t
quicksort
(t targetarr,
int start,
int end)
else
}/*關鍵資料放到『中間』*/
sutil.
swap
(targetarr,start,j);if
(startif(j+
1returntargetarr;
}/*//方式三:減少交換次數,提高效率/*/
private
?supert>>
voidquicksort
(ttargetarr,intstart,intend)
if(i/*按i++方向遍歷目標陣列,直到比key大的值為止*/
while
(i.compareto
(key)
<=0)
/*此處一定要小於等於零,假設陣列之內有一億個1,0交替出現的話,而key的值又恰巧是1的話,那麼這個小於等於的作用就會使下面的if語句少執行一億次。*/
if(i}/*此時i==j*/
targetarr[i]
=key;
//應加判斷
/*遞迴呼叫,把key前面的完成排序*/
this
.quicksort
(targetarr,start,i-1)
;/*遞迴呼叫,把key後面的完成排序*/
this
.quicksort
(targetarr,j+
1,end)
;//兩個遞迴應加判斷
}
快速排序 歸併排序 演算法設計與分析
bubble sort bubbling merge sort divide and conquer 分而治之 quick sort location 元素定位 快速排序 int partition sqlist l,int low,int high l.r 0 l.r low pivorkey l...
排序演算法分析 快速排序
假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,選擇中間位置的元素作為基準值 pivot value 其索引為 0 n 1 2 從第0個元素開始從左往右找到比基準值大的元素,其索引為i從第n 1個元素開始從右往左找到比基準值小的元素,其索引為j交換這兩個元素 從索引i...
快速排序演算法分析
快速排序演算法 include include void quicksort int arr,int nleft,int nright i nleft j nright int nmid nleft nright 2 int nmidval arr nmid while i j from right...