文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【数据结构与算法】如何对快速排序进行细节优化以及实现非递归版本的快速排序?

2023-10-22 07:17

关注

在这里插入图片描述

君兮_的个人主页

即使走的再远,也勿忘启程时的初心

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,国庆长假结束了,无论是工作还是学习都该回到正轨上来了,从今天开始恢复正常的更新频率,今天为大家带来的内容是快速排序的两大优化和非递归实现

快速排序优化

Swap(int* p1, int* p2){    int tmp = *p1;    *p1 = *p2;    *p2 = tmp;}int getMid(int* a, int left, int right){    assert(a);    int mid = (left + right) / 2;    if (a[left] > a[mid])    {        if (a[mid] > a[right])            return mid;        else if(a[right]>a[left])        {            return left;        }        else        {            return right;        }    }    else    {        if (a[mid] < a[right])            return mid;        else if (a[left] > a[right])        {            return left;        }        else        {            return right;        }    }}int PartSort1(int* a, int left, int right){    int mid = getMid(a, left, right);//三数取中    //把取好的key放到left中    Swap(&a[left], &a[mid]);    int key = left;    while (left<right)    {    //右边先走        while (left < right && a[right] >= a[key])        {            right--;        }      //左边走        while (left<right&&a[left]<=a[key])        {            left++;        }        //交换        Swap(&a[left], &a[right]);    }    //交换停下的位置的值把key换到此时左右相遇的位置    Swap(&a[key], &a[left]);    //此时key的左右都有序,由于right,left都指处于key的位置返回任意即可    return right;}void QuickSort(int* a, int left,int right){//只剩下一个值了,说明已经有序,不需要再排,递归结束    if (left >= right)        return;       int key = PartSort1(a,left,right);    //key已经满足左右都有序了不需要再排    //排key的左边    QuickSort(a, left, key-1);    //排key的右边    QuickSort(a, key+1, right);}

三数去中优化

int getMid(int* a, int left, int right){    assert(a);    int mid = (left + right) / 2;    if (a[left] > a[mid])    {        if (a[mid] > a[right])            return mid;        else if(a[right]>a[left])        {            return left;        }        else        {            return right;        }    }    else    {        if (a[mid] < a[right])            return mid;        else if (a[left] > a[right])        {            return left;        }        else        {            return right;        }    }}

对递归次数的优化

void QuickSort1(int* a, int begin, int end){if (begin >= end)return;// 小区间优化,小区间不再递归分割排序,降低递归次数if ((end - begin + 1) > 10){int keyi = PartSort1(a, begin, end);// [begin, keyi-1] keyi [keyi+1, end]QuickSort1(a, begin, keyi - 1);QuickSort1(a, keyi + 1, end);}else{InsertSort(a + begin, end - begin + 1);}}

非递归的快速排序

void QuickSort1(int* a, int begin, int end){if (begin >= end)return;// 小区间优化,小区间不再递归分割排序,降低递归次数if ((end - begin + 1) > 10){int keyi = PartSort1(a, begin, end);// [begin, keyi-1] keyi [keyi+1, end]QuickSort1(a, begin, keyi - 1);QuickSort1(a, keyi + 1, end);}else{InsertSort(a + begin, end - begin + 1);}}
void QuickSortNonR(int* a, int left,int right){    Stack st;    StackInit(&st);//初始化栈    StackPush(&st, left);//入栈    StackPush(&st, right);    while (!StackEmpty(&st))//判断栈是否为空    {        int right = StackTop(&st);//后进先出,取栈顶元素        StackPop(&st);//此时的栈顶元素出栈        int left = StackTop(&st);//此时的栈顶为left        StackPop(&st);        int key = PartSort1(a, left, right);//选key值        if (key + 1 < right)//此时key+1小于right 把key+1作为下一次排序的左 right作为右入栈        {            StackPush(&st, key + 1);            StackPush(&st, right);        }        if (left < key - 1)//key-1大于left key-1就为下一次循环的右,left为左        {            StackPush(&st, left);            StackPush(&st, key - 1);        }    }    //当栈中没有元素了,说明此时的左大于等于右,此时已经没有数据未进行排序了    StackDestroy(&st);//销毁栈}

总结

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

来源地址:https://blog.csdn.net/syf666250/article/details/133691828

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯