代码片段(快速排序)

原创 2016年06月01日 14:08:08
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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

代码片段(快速排序)

  • 2016年06月01日 14:12
  • 60KB
  • 下载

计数排序(代码片段)

  • 2016年06月08日 13:00
  • 10KB
  • 下载

收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发.

1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ ret...

堆排序(代码片段utf-8编码)

  • 2016年06月08日 11:22
  • 10KB
  • 下载

归并排序(代码片段)

  • 2016年06月08日 11:24
  • 10KB
  • 下载

Android Studio 自定义注释&快速输入代码片段

在android studio 中自定义注释模板 快速输入注释,自定义代码片段,快捷键快速输入代码片段 一.设置类创建时自动生成头部注释 比如每次创建一个类自动在头部生成一个这样的头部...

快速排序代码

  • 2016年06月14日 14:08
  • 2KB
  • 下载

快速排序代码

  • 2013年04月28日 16:55
  • 533B
  • 下载

Iphone代码片段导航

Iphone代码片段导航  Iphone开发代码片段1 Iphone开发代码片段2  Iphone开发代码片段3  1.给UITableViewController添加Tool...
  • yp120yp
  • yp120yp
  • 2012年04月20日 06:34
  • 761

快速排序代码

  • 2013年03月23日 13:11
  • 502KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码片段(快速排序)
举报原因:
原因补充:

(最多只允许输入30个字)