选择和排序的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
原创粉丝点击