选择和排序的Sherwood算法
来源:互联网 发布:俊知集团官网 编辑:程序博客网 时间:2024/06/18 08:52
题目: 编程实现快速排序的Sherwood算法
思路:只需进行随机预处理将输入实例中元素打乱即可,相当于洗牌..后处理无需进行只需调用确定的算法前先调用下述算法:
Shuffle (T) {
n ← length[T];
for i ← 1 to n-1 do {
// 在T[i..n]中随机选1元素放在T[i]上
j ← uniform(i..n);
T[ i ] <←> TI[ j ];
}
C语言实现代码:
//实现快速排序的Sherwood算法//核心是编写一个简单的洗牌算法来实现对要排序实例#include<stdio.h>#include<stdlib.h>#include<time.h>void Shuffle(int *arr,int a,int b); //洗牌int pivotLoc(int *arr,int s,int e);void quicksort(int *arr,int s,int e);int main(){ int i; int a[] = {48,6,57,42,60,72,83,73,88,85}; Shuffle(a,0,9); quicksort(a,0,9); //先洗牌 然后排序 for(i=0;i < 10;i++) printf("%d ",a[i]); printf("\n");}void Shuffle(int *arr,int l, int r){ srand((unsigned)time(NULL)); int tmp,i,j,len; len = r-l+1; for(i=0;i<len-2;i++) { j = rand()%(r-i+1) + i; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; }}int pivotLoc(int *arr,int l,int r){ int x,i,j; x = arr[l]; i =l; j = r; while(i<j) { while( i < j && arr[j] >= x) j--; if(i < j) arr[i++] = arr[j]; while( i < j && arr[i] <=x ) i++; if(i < j) arr[j--] = arr[i]; } arr[i] = x; return i;}void quicksort(int *arr,int l,int r){ int tmp; if(l<r) { tmp = pivotLoc(arr,l,r); quicksort(arr,l,tmp-1); quicksort(arr,tmp+1,r); }}
总结:
将选择和排序的确定算法修改为Sherwood算法很简单,但是当算法较复杂,例如它是一个缺乏文档资料的软件包的一部分时,就很难对其进行修改。注只有当该算法平均时间性能较优,但最坏性能较差时,才有修改的价值。一般的方法是:
1将被解的实例变换到一个随机实例// 预处理
2 用确定算法解此随机实例,得到一个解。
3 将此解变换为对原实例的解。// 后处理
0 0
- 选择和排序的Sherwood算法
- 0044算法笔记——【随机化算法】舍伍德(Sherwood)算法和线性时间选择问题
- 0044算法笔记——【随机化算法】舍伍德(Sherwood)算法和线性时间选择问题
- 离散对数计算的Sherwood 算法
- 冒泡和选择排序的递归算法
- 数组的选择排序算法和冒泡排序算法
- 插入排序、选择排序和快速排序的算法实现
- 舍伍德(Sherwood)算法学习笔记
- 排序的选择算法
- 选择排序的算法
- 选择排序的算法
- 排序算法的选择
- 选择排序和冒泡排序算法的优化
- 算法--数组的冒泡排序和选择排序
- 排序算法之选择和插入排序的简单优化
- 冒泡排序算法和选择排序算法
- 算法(选择排序的算法)
- 冒泡算法和选择排序
- android 控制POS机图文打印(一)
- 第13周 项目1-2 倒序与加倍输出数组元素
- 状态栏第一次不显示
- iframe提取与改变父页面元素
- 《unix高级环境编程》文件和目录——文件权限
- 选择和排序的Sherwood算法
- javaweb项目源文件与字节码文件目录结构
- ASP.net 学习路线(详细)
- HTML5 异步上传文件
- iOS-沙箱盒子代码解析
- 初步理解Redis及其安装配置
- tn gives the first impression is that it is not a world
- webservice相关名词解释
- Servlet 3.0 新特性详解