void __quick_sort(int a[], int l, int r) { int pivotloc; if (l >= r) return; pivotloc = partition(a, l, r); __quick_sort(a, l, pivotloc - 1); __quick_sort(a, pivotloc + 1, r); }
static void __quick_sort(void *base, size_t num, size_t size, CMP_FUNC cmpf, SWAP_FUNC swapf) { unsigned int k; __assert(base && cmpf); if (!swapf) swapf = (size == 4 ? __swap : swap_dft); if (num > 1) { k = __quick_once(base,num,size,cmpf,swapf); __quick_sort(base, k, size, cmpf, swapf); __quick_sort((char*)base+(k+1)*size, num-k-1, size, cmpf, swapf); } }
void quick_sort(void *base, size_t num, size_t size, CMP_FUNC cmpf, SWAP_FUNC swapf) { __dump(base, num, size); __quick_sort(base, num, size, cmpf, swapf); __dump(base, num, size); __verify(base, num, size, cmpf); }
static SR_INLINE int __quick_sort(SORTARRAY PARAM_INOUT array, const SORTARRAY_ITERATOR_ITR PARAM_IN iterator_low_, const SORTARRAY_ITERATOR_ITR PARAM_IN iterator_high_) { SORTARRAY_ITERATOR_INSTANCE iterator_low; SORTARRAY_ITERATOR_INSTANCE iterator_high; SORTARRAY_ITERATOR_INSTANCE iterator_clip; int status; // 排序的数量很少,使用插入排序优化 if (CHECK_ENTER_INSERT_SORT(array, iterator_low, iterator_high)) { return QUICKSORT_INSERT_SORT(array, iterator_low, iterator_high); } // 开始快速排序(递归法) SORTARRAY_ITR_COPY(array, GET_ITERATOR_INSTANCE_ADDR(iterator_high), iterator_high_); SORTARRAY_ITR_COPY(array, GET_ITERATOR_INSTANCE_ADDR(iterator_low), iterator_low_); status = __order_partition(array, GET_ITERATOR_INSTANCE_ADDR(iterator_low), GET_ITERATOR_INSTANCE_ADDR(iterator_high), GET_ITERATOR_INSTANCE_ADDR_REF(iterator_clip)); if (status < STATUS_OK) { return status; } SORTARRAY_ITR_COPY(array, GET_ITERATOR_INSTANCE_ADDR(iterator_high), iterator_high_); SORTARRAY_ITR_COPY(array, GET_ITERATOR_INSTANCE_ADDR(iterator_low), iterator_low_); if (0 != SORTARRAY_ITR_EQUELS(array, GET_ITERATOR_INSTANCE_ADDR(iterator_clip), GET_ITERATOR_INSTANCE_ADDR(iterator_low))) { SORTARRAY_ITERATOR_INSTANCE itmp_pre; SORTARRAY_ITR_COPY(array, GET_ITERATOR_INSTANCE_ADDR(itmp_pre), GET_ITERATOR_INSTANCE_ADDR(iterator_clip)); SORTARRAY_ITR_DEC(array, GET_ITERATOR_INSTANCE_ADDR(itmp_pre)); status = __quick_sort(array, GET_ITERATOR_INSTANCE_ADDR(iterator_low), GET_ITERATOR_INSTANCE_ADDR(itmp_pre)); if (status < STATUS_OK) { return status; } } if (0 != SORTARRAY_ITR_EQUELS(array, GET_ITERATOR_INSTANCE_ADDR(iterator_clip), GET_ITERATOR_INSTANCE_ADDR(iterator_high))) { SORTARRAY_ITERATOR_INSTANCE itmp_next; SORTARRAY_ITR_COPY(array, GET_ITERATOR_INSTANCE_ADDR(itmp_next), GET_ITERATOR_INSTANCE_ADDR(iterator_clip)); SORTARRAY_ITR_INC(array, GET_ITERATOR_INSTANCE_ADDR(itmp_next)); status = __quick_sort(array, GET_ITERATOR_INSTANCE_ADDR(itmp_next), GET_ITERATOR_INSTANCE_ADDR(iterator_high)); if (status < STATUS_OK) { return status; } } return STATUS_OK; }
void quick_sort(int a[], int len) { __quick_sort(a, 0, len - 1); }