快排大法好,不说日常数据处理的巨大优势,面试时能手写快排更是装X一大利器。
不过传统的快排有一大缺陷:当出现大量相同值或数据已经有序时,由于对相同值的重复递归,排序效率会急剧降低乃至O(N^2)。
为避免此情况笔者编写了快排PRO 优化算法(三明治法):

将传统快排的二分法(小于中点值、大于等于中点值)更改为三分(小于中点值、等于中点值、大于中点值)。且对等于中点值部分不再递归,因此即使存在大量重复数据依然能保持O(nlogn)的时间复杂度。

代码实现如下:

#define NODE 要排序的结构体名字
#define ATTR 这里填要排序的属性
#define NEXT 这里填存储下一个结点的变量名
/**参数一为待排序的链表头结点参数二返回的为排序以后的尾节点地址
*/
NODE* QUICK_SORT (NODE* SOUR,NODE **REAR)
{if(SOUR==NULL)  //为空结点{//此情况只有一种可能:要排序的链表是一个空链表return NULL;}NODE *MID=SOUR,*L=NULL,*R=NULL;    //中点\左侧\右侧NODE *RR,*LR,*MR=SOUR;  //左侧尾结点,右侧尾结点,中点链NODE *TEMP,*P=SOUR->NEXT;   //定位主串剩余串while(P)                //循环拆解原串{TEMP=P->NEXT;if(P->ATTR<MID->ATTR) /**这里填排序规则(默认字符串排序strcmp(P->ATTR,MID->ATTR)<0)*/{if(L==NULL)     //L为空串{L=LR=P;L->NEXT=NULL;}else{P->NEXT=L;L=P;}}else if(P->ATTR>MID->ATTR) //排序规则+1,说明排在MID后{if(R==NULL){R=RR=P;R->NEXT=NULL;}else{P->NEXT=R;R=P;}}else   //说明值与MID相同{P->NEXT=MR;MR=P;}P=TEMP;}MID->NEXT=NULL; //防止排序结束后尾结点不为空//拆解完毕,进行递归拆解if(L!=NULL&&R!=NULL){L=QUICK_SORT(L,&LR);R=QUICK_SORT(R,&RR);//合并已有序的链表LR->NEXT=MR;MID->NEXT=R;*REAR=RR;   //上传尾结点return L;}else if(R!=NULL){R=QUICK_SORT(R,&RR);MID->NEXT=R;*REAR=RR;return MR;}else if(L!=NULL){L=QUICK_SORT(L,&LR);LR->NEXT=MR;*REAR=MID;return L;}//说明只有MID一个元素*REAR=MID;return MID;
}

基于单链表快排的优化算法相关推荐

  1. 排序算法--快排的优化

    排序算法–快排的优化 下面是我写的一种快排: #include <iostream> #include <stdlib.h>using namespace std;void P ...

  2. 【智能优化算法】基于自适应策略的混合鲸鱼优化算法求解单目标优化问题附matlab代码

    1 简介 针对鲸鱼优化算法在函数优化时存在收敛速度慢,易陷入局部最优等问题,提出了一种基于自适应策略的混合鲸鱼优化算法.该算法中先利用蝙蝠算法的局部搜索机制对当前鲸鱼算法最优解进行高斯扰动产生局部新解 ...

  3. 单轴快排(SinglePivotQuickSort)和双轴快排(DualPivotQuickSort)及其JAVA实现

    快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决.通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快 ...

  4. c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统

    前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...

  5. 【数据结构与算法】带环单链表查找环的入口算法

    带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...

  6. 快速排序、快排的优化 及Java实现

    一.快速排序的思想 选取一个比较的基准,将待排序数据分为独立的两个部分,左侧都是小于或等于基准,右侧都是大于或等于基准,然后分别对左侧部分和右侧部分重复前面的过程,也就是左侧部分又选择一个基准,又分为 ...

  7. C语言基于单链表的词典软件

    C语言基于单链表的词典软件 实验1: 日期:2022-10-4 类型:设计型 题目:基于单链表的词典软件 内容: 利用单链表存储词典,可以实现从文件中加载数据.查询单词.添加词条.删除词条.将词典保存 ...

  8. 基于混沌的正余弦鲸鱼优化算法-附代码

    基于混沌的正余弦鲸鱼优化算法 文章目录 基于混沌的正余弦鲸鱼优化算法 1.鲸鱼优化算法 2. 改进鲸鱼优化算法 2.1 混沌初始化种群和参数优化 2.2 正余弦鲸鱼优化算法 2.3 混沌自适应的惯性权 ...

  9. 多目标优化算法:基于非支配排序的瞪羚优化算法(Non-Dominated Sorting Gazelle Optimization Algorithm,NSGOA)

    瞪羚优化算法(Gazelle Optimization Algorithm,GOA)由Agushaka等人于2022年提出,该算法模拟了瞪羚逃避捕食者的行为,思路新颖,性能高效. 瞪羚的身高60-11 ...

最新文章

  1. coco格式的数据集进行训练
  2. html+css3实现二级下拉菜单
  3. git本地ben远程分支_git 本地分支与远程分支
  4. java的add方法的使用_Java HashSet add()方法与示例
  5. 个人信息保护呼吁“基本法”
  6. 拍照比剪刀手泄露指纹信息;国内绿 iPhone11 抢断货;PostgreSQL 12 Beta 4 发布​ | 极客头条...
  7. 结对编程-四则运算生成
  8. 如何在Mac 上的“终端”中限制回滚行数?
  9. 拓端tecdat|R语言基于ARMA-GARCH过程的VaR拟合和预测
  10. java报表查询_数据查询 | 快逸报表工具 java报表软件
  11. win10喇叭没声音,Realtek高清音频管理器 打不开问题解决
  12. python 股票历史数据相关性 监测绘图
  13. 集成融云 即时通讯总结
  14. MyBatisPlus之逻辑删除
  15. 自制建议万用表二极管挡位?蜂鸣器档??
  16. 学完了Scratch,我要开始学Python了~~~
  17. 基于Halcon学习的新能源车牌识别【三】
  18. oracle监听启动无权限,ubuntu 下启动oracle监听失败:TNS-12555: TNS:permission denied
  19. EXCEL中的数据分析—直方图
  20. android10rom包,安卓10的刷机教程,教你刷好Killer的精简包

热门文章

  1. 【机器人基础】阻抗/导纳控制深度解析
  2. vue-fullcalendar 日历插件
  3. 【网单服务端】神鬼世界一键安装服务端双镜像优化版网游单机
  4. Quartus II下载器件库(新)
  5. 基于点线特征的激光雷达+单目视觉里程计
  6. 【个人向】《春物》 小说原文关键段落摘录
  7. 合肥长鑫芯片服务器,进军DDR5/GDDR6/LPDDR5内存 合肥长鑫计划第三代10nm工艺
  8. python交通调查数据处理_GitHub - unlimitbladeworks/traffic-monitor: 基于高德地图的交通数据分析...
  9. hp8080计算机无法usb启动,HP Compaq 8000 Elite 台式机​无法从U盘启动解决办法
  10. CF1633D Make Them Equal 题解