我们知道了普通的快速排序利用的划分函数是从两边向中间划分,但是对于单链表,这种划分函数可就显得不这么适用了。原因在于单链表每个节点只存在存放后一个结点的指针域,找到后一个节点容易,但是想要找到前一个结点的话,可就显得力不从心了。
所以,我们可以借用普通划分函数的思想,来写一个都从前向后划分的划分函数。
首先我们的i和j肯定都指向前面,我们仍然以第一个值为划分标准 。

ListNode* LinkParition(ListNode* left, ListNode* right)
{ListNode* ip = left;ListNode* jp = left->next;int tmp = left->data;while (jp != right){if (jp->data <= tmp){ip = ip->next;std::swap(ip->data, jp->data);}jp = jp->next;}std::swap(left->data, ip->data);return ip;
}


如果j指向的值大于标准值,就j向后走,当j指向的值小于等于划分标准值,这时i向后走一个,交换i和j指向的值,然后j继续向后走…直到j指向了right结点。此时完成一次划分。
剩下代码和普通快排 一样,递归执行。

void QuickPass(ListNode* left, ListNode* right)
{if (left != right){ListNode* p = LinkParition(left, right);QuickPass(left, p);QuickPass(p->next, right);}
}void ListQuickSort(ListNode* head)
{QuickPass(head, nullptr);
}

给一个完整单链表示例:

typedef int ElemType;
typedef struct ListNode
{ElemType data;ListNode* next;
}ListNode, * LinkList;ListNode* Init_List(const vector<int>& ar)
{ListNode* head = (ListNode*)malloc(sizeof(ListNode));head->data = ar[0];head->next = nullptr;ListNode* p = head;for (int i = 1; i < ar.size(); ++i){ListNode* s = (ListNode*)malloc(sizeof(ListNode));if (s == nullptr) return nullptr;s->data = ar[i];s->next = nullptr;p->next = s;p = s;}return head;
}void Print_List(ListNode* p)
{while (p != nullptr){cout << p->data << " ";p = p->next;}cout << endl;
}ListNode* LinkParition(ListNode* left, ListNode* right)
{ListNode* ip = left;ListNode* jp = left->next;int tmp = left->data;while (jp != right){if (jp->data <= tmp){ip = ip->next;std::swap(ip->data, jp->data);}jp = jp->next;}std::swap(left->data, ip->data);return ip;
}void QuickPass(ListNode* left, ListNode* right)
{if (left != right){ListNode* p = LinkParition(left, right);QuickPass(left, p);QuickPass(p->next, right);}
}void ListQuickSort(ListNode* head)
{QuickPass(head, nullptr);
}int main()
{vector<int>ar = { 56,34,23,78,90,12,45,67,89,100 };LinkList head= Init_List(ar);Print_List(head);ListQuickSort(head);Print_List(head);return 0;
}

排序算法——单链表快速排序(划分函数从一边划分)相关推荐

  1. python单链表排序_单链表排序之选择排序

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目.单链表排序的关键是交换算法,需要额外考虑.选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序. C实现代码如下: Li ...

  2. js排序算法详解-快速排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-快速排序 既然是快速排序,那顾名思义一定很快,快的连小编都被懵逼了好几圈!建议先不要看动图,先看第一种写法: ...

  3. 数据结构(七)高级排序算法——归并、快速排序

    一.归并排序 1.排序原理 归并排序算法是一种利用了分治算法思想实现的排序算法,这种排序算法是基于有序数组合并的归并排序算法的基本思想就是:判断一个待排序序列的长度,只要这个待排序序列的长度是超过1的 ...

  4. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  5. python实现单链表快速排序升序linkedqueue_同时对多个数组进行排序

    关于 同时对多个数组进行排序的搜索结果 回答 本人学习数据结构时看到的不错的总结,共享一下了 文件有一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字; 排序是将文件按关键字的递增(减) ...

  6. 常考数据结构与算法:单链表的排序

    题目描述 给定一个无序单链表,实现单链表的排序(按升序排序). 输入 [1,3,2,4,5] 返回值 {1,2,3,4,5} public class SortInListME {public sta ...

  7. 单链表快速排序算法实现

    单链表结构: typedef int ElemType; typedef struct ListNode* List;struct ListNode {ElemType keyList next; } ...

  8. python实现单链表快速排序升序linkedqueue_数据结构回顾

    顺序结构 顺序栈(Sequence Stack) 1 2 3 4 5 6typedef struct { ElemType *elem; int top; int size; int incremen ...

  9. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题

    链表删除 [203] Remove Linked List Elements [19] Remove Nth Node From End of List [83] Remove Duplicates ...

最新文章

  1. 最强的篮球队和马尔可夫模型
  2. 分享一下python入门知识点-输入与输出教程,不喜勿喷
  3. 在Ubuntu下解决E: 无法对目录 /var/lib/apt/lists/ 加锁的问题
  4. stm32怎么查看什么原因引起的nmi_为什么会有口臭,口臭是什么原因引起的,口臭是怎么回事...
  5. mysql和php的登录注册界面_php实现注册和登录界面的方法
  6. [LeetCode] Add Digits - 数字各个位数求和
  7. .NET多线程总结和实例介绍
  8. pks系统如何添加服务器,pks服务器的上电步骤.pdf
  9. 数据库杂谈(九)——事务管理
  10. 开机自启动和由一个APK启动另一个APK核心代码
  11. # 安卓手机启动黑阈服务
  12. mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义
  13. 阿里云存储oss依赖报错解决方法
  14. windows10正式版官方原版镜像iso下载地址
  15. 单片机数码管动态显示时钟C语言,如何利用单片机数码管程序模拟是时钟显示时间?...
  16. SylixOS学习一—— SylixOS启程之旅 虚拟机配置
  17. 推荐基于深度学习实时同步生成2D动画口型算法
  18. 信息化知识-信息与信息化
  19. vue2.0_在vue中实现input输入框的模糊查询
  20. WPAN、WLAN、WMAN、WWAN无线通讯技术区别

热门文章

  1. Oracle 中重新编译无效的存储过程, 或函数、触发器等对象(转)
  2. c++实现高精度乘法!
  3. 变压器相邻公交站 候车人提心吊胆[图]
  4. iOS之深入解析Runloop的底层原理
  5. HarmonyOS之深入解析图像的编码和解码
  6. Uncaught TypeError: Cannot read property 'value'' of null
  7. ROS Kinetic 与STM32通信,控制一盏LED灯
  8. 【Linux系统编程】进程间通信--有名管道
  9. 数据库mysql存储过程_[数据库]mysql存储过程的建立及使用
  10. vector 查找_同样是Excel中的查找函数,这个函数却比VLOOKUP功能强100倍