void QuickSort(int* _arr, int _p, int _r){
if(_arr && _p < _r){
int _q = Partition(_arr, _p, _r);
QuickSort(_arr, _p, _q-1);
QuickSort(_arr, _q+1, _r);
}
}
/*
*算法描述 对于任意一个下标k
* 若p<= k <= i, 则 _arr[k] <= _v
* 若i+1<= k <= j,则 _arr[k] > _v
* 若k = r, 则_arr[k] = _v
*/
int Partition(int* _arr, int _p, int _r){
int _v = _arr[_r];
int i = _p-1;
for(int j = _p; j < _r; ++j){
if(_arr[j] <= _v){
++i;
int temp = _arr[i];
_arr[i] = _arr[j];
_arr[j] = temp;
}
}
int temp = _arr[_r];
_arr[_r] = _arr[i+1];
_arr[i+1] = temp;
return i+1;
}
void HoareQuickSort(int* _arr, int _l, int _h){
if(_arr && _l < _h){
int _q = HoarePartition(_arr, _l, _h);
if(_q != -1) HoareQuickSort(_arr, _l, _q-1);
if(_q != -1) HoareQuickSort(_arr, _q+1, _h);
}
}
int HoarePartition(int* _arr, int _l, int _h){
int i = _l, j = _h, temp = _arr[_h];
while(i < j){
while(i < j && temp >= _arr[i]) ++i;
if(i < j){
_arr[j] = _arr[i];
--j;
}
while(i < j && temp < _arr[j]) --j;
if(i < j){
_arr[i] = _arr[j];
++i;
}
}
return i;
}
void RandomizedQuickSort(int* _arr, int _p, int _r){
if(_arr && _p < _r){
int _q = RandomizedPartition(_arr, _p, _r);
RandomizedQuickSort(_arr, _p, _q-1);
RandomizedQuickSort(_arr, _q+1, _r);
}
}
/*
* 算法描述: 随机抽样的方法从A[p...r]中随机选择一个元素作为主元
*/
int RandomizedPartition(int* _arr, int _p, int _r){
srand((unsigned int)time(0));
int i = _p + rand()%(_r - _p);
int temp = _arr[i];
_arr[i] = _arr[_r];
_arr[_r] = temp;
int _q = Partition(_arr, _p, _r);
return _q;
}
/*
* 算法描述: 一种改进的RandomizedPartition, 要从子数组中更细致
* 选择作为主元元素(不是简单地随机选择)。采用的做法是三数取中法
* 从子数组中随机选出3个元素,去其中的中位数作为主元(n>=3);
* Three Number Fetch Middle Number(TNFMN)
*/
int TNFMNPartition(int* _arr, int _p, int _r){
int* _g = (int*)malloc(sizeof(int)*3);
srand((unsigned int)time(0));
for(int i = 0; i < 3; i++) _g[i] = _p + rand()%(_r - _p);
int _v = _r;
for(int i = 0; i < 3; i++){
if((_arr[_g[i%3]] <= _arr[_g[(i+1)%3]] && _arr[_g[i%3]] >= _arr[_g[(i+2)%3]]) ||
(_arr[_g[i%3]] >= _arr[_g[(i+1)%3]] && _arr[_g[i%3]] <= _arr[_g[(i+2)%3]])){
_v = _g[i];
int temp = _arr[_r];
_arr[_r] = _arr[_v];
_arr[_v] = temp;
break;
}
}
return Partition(_arr, _p, _r);
}
void RandomizedQuickSortRange(int* _arr, int _p, int _r){
if(_arr && _p < _r){
int* rv = RandomizedPartitionRange(_arr, _p, _r);
RandomizedQuickSortRange(_arr, _p, rv[0]-1);
RandomizedQuickSortRange(_arr, rv[1]+1, _r);
}
}
/*算法功能:排列A[p...r]的元素,返回值是连个数组的下标q和t,
* 其中p <= q <= t <= r
* A[q...t]中的所有元素都相等(A[q] = A[q+1] = ...=A[t])
* A[p...q-1]中的每一个元素都小于A[q]
* A[t+1...r]中的每一个元素都大于A[t]
*/
int* RandomizedPartitionRange(int* _arr, int _p, int _r){
srand((unsigned int)time(0));
int i = _p + rand()%(_r - _p);
int temp = _arr[_r];
_arr[_r] = _arr[i];
_arr[i] = temp;
int _q = _p, _t = _p, _v = _arr[_r];
for(int j = _p; j < _r; ++j){
if(_arr[j] <= _v){
temp = _arr[j];
_arr[j] = _arr[_t];
_arr[_t] = temp;
++_t;
}
}
temp = _arr[_r];
_arr[_r] = _arr[_t];
_arr[_t] = temp;
_v = _arr[_t];
for(int j = _p; j < _t; ++j){
if(_arr[j] < _v){
temp = _arr[j];
_arr[j] = _arr[_q];
_arr[_q] =temp;
++_q;
}
}
int* rv = (int*)malloc(sizeof(int)*2);
rv[0] = _q;
rv[1] = _t;
return rv;
}
/*
* 算法描述: 获取数组中第x小的元素, 利用快速排序中的分割部分
* 的算法, A[p...r]区间范围内获取第x小的元素
*/
int GetXthSmallElement(int* _arr, int _p, int _r, int _x){
while(_arr && _p < _r && (_x-1) >= _p && (_x-1) <= _r){
int _q = Partition(_arr, _p, _r);
int xth = _q + 1;
if(xth == _x){
break;
}
else if(xth < _x){
_p = _q+1;
}
else
_r = _q -1;
}
if(_arr && _p < _r && (_x-1) >= _p && (_x-1) <= _r)
return _arr[_x-1];
else
return -1;
}
代码片段(快速排序)
最新推荐文章于 2024-09-23 14:27:27 发布