快速排序 分區函數
阿新 • • 發佈:2019-01-02
store sta 排序 return fir 其他 round true ray
適合我的快排分區函數:
def patition2(arr, l, r): pivot = arr[l] index = l+1 for i in range(l+1, r+1): if arr[i] < pivot: arr[i], arr[index] = arr[index], arr[i] index += 1 arr[l], arr[index-1] = arr[index-1], arr[l] return index-1
註意要點:
1、返回index-1,非常關鍵!!!因為 assert arr[index-1] < pivot and arr[index]>=pivot
2、註意判定條件是 <,當然 <= 也是可以的!!!
3、註意index起始位置是L+1
4、循環的起始位置也是L+1
網上的其他寫法:
// C++ void Swap(int &first_number, int &second_number) { int temp = first_number; first_number = second_number; second_number = temp; } int Partition(int array[], int start, int end, int pivot_index) { int pivot = array[pivot_index]; int store_index = start; Swap(array[pivot_index], array[end]); for (int iLoop = start; iLoop < end; iLoop++) { if (array[iLoop] < pivot) { Swap(array[iLoop], array[store_index]); store_index++; } } Swap(array[store_index], array[end]); return store_index; }
template<class T> int Partition(T a[], int start, int end, int pivotIndex){ T pivot = a[pivotIndex]; Swap(a[pivotIndex], a[end]); int storeIndex = start; for(int i = start; i < end; ++i) { if(a[i] < pivot) { Swap(a[i], a[storeIndex]); ++storeIndex; } } swap(a[storeIndex], a[end]); return storeIndex; }
分區的思想,還可以用在解決計算中值和選擇問題上。
//中值問題 public static int getMedian(int[] array){ return getKth(array,array.length/2); } //選擇問題 public static int getKth(int[] array,int k){ int low =0,high = array.length -1; int s = 0; do{ s = partition(array,low,high); if(s>k) high = s-1; else low = s+1; }while(s != k); return array[s]; }
快速排序 分區函數