演算法設計與分析 快速排序

2021-10-25 19:56:48 字數 2140 閱讀 8876

設要排序的陣列是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...