※ 引述《sing10407 (阿U)》之銘言:
: public static void quickSort(int[] data,int l,int r){
: int i, j, tmp, v;
: if (r > l) {
: v = data[l];//l=left,r=right,v=標竿
: i = l;//i和j則是移動與交換的點
: j = r + 1;
因為是已經排序好的陣列,
而你又都是拿最左邊(最小)的 data[l] 當作 pivot,
也就是說每次將陣列切成兩半時,其中一半都沒有元素。
這個例子正巧是這種 Quicksort 實作的 worst case,
有多少元素就要遞迴幾層,然後 method stack 就爆掉了。
解法有二:
1. 增加 stack size,好像前面幾篇正好討論過。
2. 更換 Quicksort 選取 pivot 的方式,
有些版本會用隨機取 pivot,有的會用第 (l+r)/2 個元素當作 pivot,
這些都能解決你的問題。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.78.231
推
03/11 14:03, , 1F
03/11 14:03, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):