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...