快速排序的學習中遇到的問題(java)

2021-06-28 22:22:19 字數 2354 閱讀 9939

package

com.

mmrx

.quicksort

;

/*快速排序*/

public

class

quicksort

/*輔助方法*/

private

static

void

quicksort

(int

list

,int

first

,int

last

)

}

/*合併、尋找主元*/

private

static

intpartition

(int

list

,int

first

,int

last

)

list

[low]=

pivot

;

return

low;

}

}

問題1:在定位主元的方法partition中,兩個while的順序是否可以變?

/*前後端遍歷區間,找到前段大於主元,後端小於

* 主元的元素,交換位置*/

while

(high

>

low

)

由於在方法開頭,我們將主元確定為序列第乙個元素,之後的操作都是在序列本身上的賦值操作。

在方法中保留的是主元的值,所以應該先將比主元小的記錄移動到低端,再考慮比主元大的記錄,即先考慮high,後考慮low。

由**可知,在high向前尋找的過程中,一旦發現元素值比pivot值小,就會將list[low]賦值為list[high]元素值,這樣的話,list[low]原本的值就會丟失。但是最開始的list[low]已經被作為主元保留了下來,所以沒有影響。

如果**是這樣

while

(high

>

low

)

首先進行的是low向後遍歷陣列,找到的low索引值應該是比主元大的陣列元素的索引,此時,list[high]原本的值被list[low]值覆蓋,徹底丟失,就會使得陣列內容被改變,結果自然也就不正確了。

問題2:

list

[low]=

pivot

;

return

low;

返回值為何是low而不是high?

有這麼幾種情況,第一種,在while中不發生值交換,那麼主元的位置仍舊是原本的位置,即low(陣列索引為0的位置);第二種,在while中發生值交換,執行完畢下面一句後不再發生值交換,結束迴圈。

list

[low]=

list

[high

];//將比主元小的記錄移動到低端

即low值被覆蓋,此時list[low] == list[high],比主元小的值被向前移動了,但是high位置的元素空下了,而high位置的值應當為pivot,low向後挪動,high不變,執行完畢迴圈,有low == high,接下來執行問題2中的語句也就順理成章了;第三種,執行完畢下面後不再發生值交換,結束迴圈,

list

[high]=

list

[low

];//將比主元大的記錄移動到高階

從high位置開始向前遍歷,找到比主元小的元素,執行 list[high] = list[low],比主元大的值被向後移動,low位置的元素空下了,high向前挪動,low的值不變,執行完畢迴圈,有low == high,執行問題2中的語句。

實質上,只有兩種可能,不發生值交換(low == 0)和發生值交換(最終肯定有low == high),而第一種可能就決定了返回值只能是low而不是high。

排序方法之 快速排序法 以及學習中遇到的問題

演算法大體描述 選乙個數作為基數,將大於這個數的放到它的右邊,將小於這個數的放到它的左邊,第二趟將陣列從基數的地方分為兩個並重複選擇基數,重複上述步驟 我對此排序法的看法 難點我覺得就是 怎樣將基數放到中間的位置,即左邊的全小於基數,右邊全大於基數 怎樣將按第一步排列好的陣列在它前後兩個位置分開再繼...

學習中遇到的問題

頂層const和底層const的概念與區別。vector的sort演算法究竟有沒有使用std swap或者自定義型別自己的swap?類中static成員在 初始化?函式的預設引數是引用,用右值初始化時,為什麼必須是const型別?void resize size t n,std string s s...

C 學習中遇到的問題

在c 學習中遇到的問題集中在此,若有高人看見希望給出解決辦法,在日後的學習中本人若找到解決辦法,也在此更新!1 如何實現ipconfig all命令的全部功能 region 另類解法 程式如下 system.diagnostics.process p new system.diagnostics.p...