代码片段(快速排序)

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

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

为 Eclipse 构建片段扩展

了解如何为 Eclipse 和 Rational Application Developer V7 构建一个插件。可以使用这个插件定义片段,从而轻松地添加符合企业标准的代码。这个插件与 Web Too...
  • alex197963
  • alex197963
  • 2008年07月04日 08:49
  • 1921

Python 常用的代码片段

原文地址对于Java开发者来说,第一次看见Python的语法可能觉得很奇怪。下面是一些常用的Python代码片段,但是这些代码并不是那么容易被新手开发者记住。这些常用代码片段叫作“具有Python语言...
  • guoyj21
  • guoyj21
  • 2015年09月02日 09:52
  • 154

HTML文件中引入其他HTML代码片段

问题:某程序媛问怎么在HTML文件里面不使用JS 引入其他HTML代码片段 解决方案有如下两种: 不使用JS引入其他HTML代码片段 欢...
  • qq_16371909
  • qq_16371909
  • 2017年09月06日 10:39
  • 308

Xcode开发技巧之code snippets(代码片段)

里面有很多Xcode自带的代码片段,上例中的dowhile就是其中的一个。 二、如何自定义代码片段 由于项目、所用语言或者编码习惯的差别,不同的程序员习惯用的代码片段也不尽相同,这就有了自定义代码片...
  • wzzvictory_tjsd
  • wzzvictory_tjsd
  • 2013年09月29日 18:47
  • 8044

Xcode 保存代码片段CodeSnippets,以后可以直接呼出

(1)用户自己写的代码块, xuxu
  • sinat_20037505
  • sinat_20037505
  • 2015年06月29日 19:46
  • 540

VS Code 折腾记 - (6) 基本配置/快捷键定义/代码片段的录入(snippet)

本来分成三篇来写的,但是想了想没必要,大家都是聪明人。。。简单的东西点一下就晓得了。...
  • bomess
  • bomess
  • 2017年02月23日 22:04
  • 5597

值得每天看一遍的经典代码片段

敲过的好程序容易忘怎么办?每天看就不会忘了。 这里我列出了许多很重要但是又容易忘的代码,这些代码都值得每天看一遍。 (1).算法 排序算法(选择,插入,冒泡,快速,希尔,堆排序,归并...) 经典...
  • github_36186488
  • github_36186488
  • 2017年05月16日 09:23
  • 200

java代码片段

1.列出当前classpath下面的所有配置文件 String[] dirs= System.getProperty("java.class.path").split(";"); ...
  • Senssic
  • Senssic
  • 2015年11月19日 11:14
  • 379

vscode自定义代码段

用vscode做开发时,平时所用的代码段比较简洁,为了提高开发效率,我们需要自定义我们用着习惯方便的代码段,这里只是以js,vue为例。  相信大家一看就明白,至于代码段在哪里编写,在这我就不多说了...
  • yucihent
  • yucihent
  • 2018年02月02日 21:12
  • 45

使用idea自定义代码段

使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Live templ...
  • qingfengmuzhu1993
  • qingfengmuzhu1993
  • 2017年03月16日 21:54
  • 470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码片段(快速排序)
举报原因:
原因补充:

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