代码片段(快速排序)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cugriver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值