快速排序的劃分方法(5種)
自己做的筆記,來自看過的部落格和刷題的時候的發現。
劃分的方法
對於元素進行比較,只有三種結果 >/=/<
所以我們可以假設是紅色
陣列劃分完之後應該是 藍/藍白+pivot+紅/紅白
1、單指標從左向右掃瞄跳過 藍白
最終劃分結果: 藍白混合+pivot+紅
int partition(vector& arr, int l, int r)
}swap(arr[pivot_pos], arr[r]); // 退出迴圈時最後把pivot與r交換,此時l與r交錯,l指向右部分第一元素,r指向左部分最後元素
return r;//返回當前pivot位置
}void quicksort(vector& arr, int begin, int end)
}swap(arr[r], arr[pivot_pos]); // 最後把主元與右指標的元素交換
return r;
}void quicksort(vector& arr, int begin, int end)
}
注:可以試試 【藍白混合+pivot+紅】 或【藍+pivot+紅白混合】
4、抽位填充(雙指標變種)
最終劃分結果: 藍白混合+pivot+紅白混合
int quicksort(vector&arr, int l, int r)
arr[l] = temp;
return l;
}
可以試試 【藍白混合+pivot+紅】 或【藍+pivot+紅白混合】
5、三指標(唯一乙個 藍白紅三段分明)
最終劃分結果: 藍+白+紅
注:白色部分含pivot,位置隨意,因為函式不需要返回pivot,只需返回白色部分的第乙個和最後乙個元素
void partition(vector& arr, int l, int r, int &equal_begin, int &equal_end) //注意不需要返回pivot位置了
else if (arr[l] < pivot)
else
}//退出迴圈後l指向 由於l跳過白色元素,所以l會指向白色部分最後乙個元素的下乙個,即紅色部分第乙個
//r與l交錯,指向白色部分最後乙個
//equal指向白色部分第乙個
equal_begin = equal; // equal 指向 白色部分第乙個元素
equal_end = l-1; // r/l-1 指向 白色部分最後乙個元素
}void quicksort(vector&arr, int begin, int end)
}
快速排序的最早劃分方法 Hoare劃分
快速排序的劃分過程最早由c.r.hoare設計,偽 如下 hoare partition a,p,r x a p i p 1 j r 1 while true repeat j j 1 until a j x repeat i i 1 until a i x ifi j exchange a i w...
劃分 快速排序
很簡單。就不解釋了。就說說自己寫 時遇到的問題吧。無辜的總有乙個0值,插入到 左邊 12 10 3 198 120 8 54 7 12 10 3 0 0 8 54 7 只因為,陣列長度是10,但是只有8個資料,所以就有2個陣列元素為0 package high public class partin...
排序 快速排序 另一種取劃分點的方法
最基本的劃分點由陣列的最後乙個值來確定,現在是將陣列的最後乙個值的前乙個數值作為劃分點,但是需要經過三項取一方法的變換,最後它位置上的值是三個中最大的。public class arrayins public void insert long value public intsize public ...