dpwqb 2019-10-07 17:29 采纳率: 33.3%
浏览 829
已采纳

如何实现以平均值为界值的快速排序算法?

【问题】快速排序算法中,如何选取一个界值(又称为轴元素),影响着快速排序的效率,而且界值也并不一定是被排序列中的一个元素。例如,我们可以用被排序列中所有元素的平均值作为界值。编写算法**_实现以平均值为界值的快速排序方法_**。 【石油大学 1998 五 (18 分)】

下面附带有书本及网络所流传的一种解答:

int partition (RecType r[],int l,h)
{ int i=l,j=h,avg=0;
for(;i<=h;i++) avg+=R[i].key;
i=l; avg=avg/(h-l+1);
while (i<j)
{ while (i<j &&R[j].key>=avg) j--;
if (i<j) R[i]=R[j];**//注意这里可能会把第一个R[i]覆盖掉**
while (i<j &&R[i].key<=avg) i++;
if (i<j) R[j]=R[i];
}
if(R[i].key<=avg) return i; else return i-1;
}
void quicksort (RecType R[],int S,T);
{if (S<T)
{k=partition (R,S,T);
quicksart (R,S,k);
quicksart (R,k+1,T);}
}

我实现了该算法,但很明显有错误,因为在排序过程存在数据丢失,**最后应该需要确定一个最终位置,但这个最终位置应该是那个第一个被覆盖掉的元素**,所以正确的解决办法应该是什么呢?

  • 写回答

2条回答 默认 最新

  • threenewbee 2019-10-07 20:24
    关注

    你的代码太乱,根本不能运行,我把分区的代码重新写了一下

    作为程序员,我们只讨论可以运行的代码,不讨论书本上根本不通的东西。

    #include <stdio.h>
    
    typedef union
    { int key; } RecType;
    
    /*
    int partition (RecType R[],int l,int h)
    { int i=l,j=h,avg=0;
    for(;i<=h;i++) avg+=R[i].key;
    i=l; avg=avg/(h-l+1);
    while (i<j)
    { while (i<j &&R[j].key>=avg) j--;
    if (i<j) { int t = R[i].key; R[i].key = R[j].key; R[j].key = t; }//注意这里可能会把第一个R[i]覆盖掉**
    while (i<j &&R[i].key<=avg) i++;
    if (i<j){ int t = R[i].key; R[i].key = R[j].key; R[j].key = t; }
    }
    if(R[i].key<=avg) return i; else return i-1;
    }
    
    */
    
    int partition (RecType R[],int l,int h)
    {
        int i=l,avg=0;
        for(;i<=h;i++) 
            avg+=R[i].key;
        avg=avg/(h-l+1);
        int pivot = R[h].key;
        i = l - 1;
        for (int j = l; j <= h- 1; j++)
        {
            if (R[j].key <= pivot)
            {
                i++;
                int t = R[i].key; R[i].key = R[j].key; R[j].key = t;
            }
        }
        int t = R[i+1].key; R[i+1].key = R[h].key; R[h].key = t;
        return (i + 1);
    }
    
    void quicksort (RecType R[],int S,int T)
    {
        if (S<T)
        {
            int k=partition (R,S,T);
            quicksort (R,S,k-1);
            quicksort (R,k+1,T);
        }
    }
    
    int main()
    {
        RecType arr[] = { {14}, {7}, {8}, {12}, {5}, {3}, {9}, {3}, {19}, {1} };
        int i;
        quicksort(arr, 0, sizeof(arr) / 4 - 1);
        for (i = 0; i < sizeof(arr) / 4 - 1; i++)
            printf("%d ", arr[i].key);
        return 0;
    }
    

    之前的程序有点问题,修改下

    #include <stdio.h>
    
    typedef union
    { int key; } RecType;
    
    int partition (RecType R[],int l,int h)
    {
        int i=l,avg=0;
        int j = h;
        for(;i<=h;i++) 
            avg+=R[i].key;
        avg=avg/(h-l+1);
        i = l;
        j = h;
        while(i<j){
            while(R[i].key<avg&&i<=j)  ++i;
            while(R[j].key>avg&&i<=j)  --j;
            if(i<j)
            { 
                int t = R[i].key; R[i].key = R[j].key; R[j].key = t;
                i++;
                j--;
            }
    
        }
        return j;
    }
    
    void quicksort (RecType R[],int S,int T)
    {
        if (S<T)
        {
            int k=partition (R,S,T);
            quicksort (R,S,k);
            quicksort (R,k+1,T);
        }
    }
    
    int main()
    {
        RecType arr[] = { {14}, {7}, {8}, {12}, {5}, {3}, {9}, {3}, {19}, {1} };
        int i;
        quicksort(arr, 0, sizeof(arr) / 4 - 1);
        for (i = 0; i < sizeof(arr) / 4; i++)
            printf("%d ", arr[i].key);
        return 0;
    }
    

    1 3 3 5 7 8 9 12 14 19

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)