链表快排 & 基于链表的排序

以前只知道链表做插入(朴素、非二分)排序挺方便的。现在知道了(单)链表进行快速排序也是很好的(只是跟一般的快排的方式不一样)。

参考:

http://blog.csdn.net/otuhacker/article/details/10366563

我们只需要两个指针p和q,这两个指针均往next方向移动,移动的过程中保持p之前的key都小于选定的key,p和q之间的key都大于选定的key,那么当q走到末尾的时候便完成了一次支点的寻找。如下图所示:

时间: 2024-10-28 05:17:55

链表快排 & 基于链表的排序的相关文章

链表快排

给定一个单向链表,在O(1)空间复杂度和O(nlogn)时间复杂度下进行排序 # -*- coding: utf-8 -*- # @Time : 2019-04-19 20:07 # @Author : Jayce Wong # @ProjectName : job # @FileName : linkedListQuickSort.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJ

算法学习——单链表快排

/**  * 以p为轴对start-end间的节点进行快排(包括start && 不包括end):  * 思路:  * 1.将头节点作为轴节点start,从start.next开始遍历,如果节点小于轴start的值,将该节点插入到轴节点后面:  * 2.将轴节点插入合适位置,即找到最后一个小于轴的节点,将该节点与轴节点值互换,此时就链表分为两部分,小于轴节点和大于轴节点:  * 3.递归的遍历2中两部分节点.  *   * @param p  * @param start  * @para

单链表快排 改变节点位置

快速排序2(算法交换链表节点,平均时间复杂度O(nlogn),不考虑递归栈空间的话空间复杂度是O(1)) 这里的partition,我们选取第一个节点作为枢纽元,然后把小于枢纽的节点放到一个链中,把不小于枢纽的及节点放到另一个链中,最后把两条链以及枢纽连接成一条链. 这里我们需要注意的是,1.在对一条子链进行partition时,由于节点的顺序都打乱了,所以得保正重新组合成一条新链表时,要和该子链表的前后部分连接起来,因此我们的partition传入三个参数,除了子链表的范围(也是前闭后开区间)

数据结构-链表快排

1 #include<cstdio> 2 #include<cstdlib> 3 #include<string> 4 5 struct Node{ 6 int num; 7 Node* next; 8 }; 9 10 void Add(Node **head, int num){ 11 Node *node = new Node; 12 node->num = num; 13 node->next = *head; 14 (*head) = node; 1

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[

快速排序——一次快排的应用(笔试&amp;面试)

将数组中的大写字母与小写字母分开 一:一个数组总存储有且in有大写和小写字母,编写一个函数对数组内的字母重新排列,让小写字母在所有大写字母之前.(相对顺序没有要求)[2012·中兴.2013·腾讯] 使用快排的一次排列即可实现,代码如下: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 6 bool isUpper( char ch ) //eq

单链表的排序(快排和冒泡实现)以及查找中间结点

//快排,冒泡链表排序 #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性

C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =

待字闺中之快排(QuickSort)单向链表(Singly Linked List)

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的快速排序一样,都需要找到一个pivot元素.或者节点.然后将数组或者单向链表划分为两个部分,然后递归分别快排. 针对数组进行快排的时候,交换交换不同位置的数值,在分而治之完成之后,数据就是排序好的.那么单向链表是什么样的情况呢?除了交换节点值之外,是否有其他更好的方法呢?可以修改指针,不进行数值交换.这可以获取更高的效率. 在修改指针的过程中,会产生新的头指针以及尾指针,要记录下来.在par