三数中值法快速排序

要求根据给定输入,按照课堂给定的快速排序算法进行排序。在划分时,以当前序列的首位元素、中间位置元素和最末元素的中间值为枢轴,记为median3。注意,如median3不在首尾,需要和首位元素交换位置。

要求输出排序结果和median3的返回值。

 

 注:1,cutoff值为5,不足cutoff使用插入排序。

        2,输入、输出格式参见测试用例0。

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 41↵
  2. 17↵
  3. 34↵
  4. 0↵
  5. 19↵
  6. #↵
以文本方式显示
  1. After Sorting:↵
  2. 0 17 19 34 41 ↵
  3. Median3 Value:↵
  4. none↵
1秒64M0
测试用例 2以文本方式显示
  1. 61↵
  2. 59↵
  3. 82↵
  4. -10↵
  5. 31↵
  6. -2↵
  7. -3↵
  8. 10↵
  9. 2↵
  10. 108↵
  11. 12↵
  12. 80↵
  13. -21↵
  14. 127↵
  15. 12↵
  16. #↵
以文本方式显示
  1. After Sorting:↵
  2. -21 -10 -3 -2 2 10 12 12 31 59 61 80 82 108 127 ↵
  3. Median3 Value:↵
  4. 12 -2 31 80 ↵
1秒64M0

 

#include<iostream>  
#include<algorithm>  
#include<string>  
using namespace std;  
  
int sz[100],median[100],mnum;  
  
  
int Median3(int lt, int rt) //三平均划分法   
{  
    int Middle = (lt + rt) / 2;  
    if (sz[lt] > sz[Middle])  
        swap(sz[lt], sz[Middle]);  
    if (sz[lt] > sz[rt])  
        swap(sz[lt], sz[rt]);  
    if (sz[Middle] > sz[rt])  
        swap(sz[Middle], sz[rt]);  
    swap(sz[Middle], sz[rt - 1]);  
    median[mnum] = sz[rt - 1];  
    ++mnum;  
    return sz[rt - 1];  
}  
  
void InsertSort(int lt, int rt)  
{  
    for (int i = lt + 1; i <= rt; i++)  
    {  
        int temp = sz[i];  
        if (sz[i] < sz[i-1])  
        {  
            int j = lt;    
            for (; sz[j] < temp; j++); //找到插入点   
            for (int k = i; k > j ; k--)  sz[k] = sz[k-1];  //后移   
            sz[j] = temp;                     
        }  
    }  
    return;  
}  
  
  
void QuickSort(int lt, int rt)  
{  
    if(rt-lt<5)  
    {  
        InsertSort(lt, rt);  
        return;  
    }   
    else if (lt < rt)  
    {  
        int pivot = Median3(lt, rt);  
        int  L = lt,R = rt - 1; //从左到右的扫描从第一个元素开始,从右到左的扫描从倒数第二个元素开始   
        while (L < R)  
        {  
            while (L < R&&sz[++L] < pivot);  
            while (L < R&&sz[--R] > pivot);  
            swap(sz[L], sz[R]);  
        }  
        swap(sz[L], sz[rt - 1]);  
          
        int Middle = L; // 中轴   
        if (Middle != -1)  
        {  
            QuickSort(lt, Middle - 1);  
            QuickSort(Middle + 1, rt);  
        }  
    }  
}  
  
  
int main()  
{  
    string s1;  
    int length;  
    while(1)  
    {  
        cin>>s1;  
        if(s1[0]=='#')  break;  
        sz[length]=atoi(s1.c_str());  
        ++length;  
    }  
    QuickSort(0,length-1);  
    cout<<"After Sorting:"<<endl;  
    for(int i=0; i<length ; ++i)  
    {  
          
        cout<<sz[i]<<" ";  
    }  
    cout<<endl;  
    cout<<"Median3 Value:"<<endl;  
    if(length>5)  
    {  
        for(int i ;i<mnum;++i) cout<<median[i]<<" ";  
    }  
    else cout<<"none";  
    cout<<endl;  
}  

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值