【本文链接】

http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html

【题目】

单链表的特点是:单向。设头结点位head,则最后一个节点的next指向NULL。如果只知道头结点head,请问怎么将该链表排序?

【分析】

对于数组的快排:有2种方式。

(1)指针相向移动:一个指针i指向头,一个指针j指向尾,然后两个指针相向运动并按一定规律交换值,最后找到一个支点p使得支点左边的值小于支点,支点右边的值大于支点。由于单链表只有next指针,没有前驱指针,因此这种方法行不通。

(2)指针同向移动:两个指针i和j,这两个指针均往数组的右方移动,移动的过程中保持i之前的值都小于选定的key,i和j之间的值都大于选定的key,那么当j走到末尾的时候便完成了一次支点的寻找。这个思路非常适合单链表。

对于数组,我们很容易写出下面的代码。

【代码1】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/5/30
*/

// i from left,j from right
// i------------>p<-----------------j
int Partition(int a[], int left, int right)
{
    // partition so that a[left..p-1]<=a[p] and a[p+1..right]>a[p]
    int pivot = a[left], i = left , j = right;
    while (i < j)
    {
        while (a[i] <= pivot) i++;
        while (a[j] > pivot) j--;
        if (i < j)
            myswap(a[i], a[j]);
    }
    myswap(a[left], a[j]);
    return j;
}

void QuickSort(int a[], int left, int right)
{
    if(left < right) // less
    {
        int p = Partition(a, left, right);
        QuickSort(a, left, p - );
        QuickSort(a, p + , right);
    }
}

void  QuickSort(int a[], int n)
{
    QuickSort(a, );
}

【代码2】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/5/30
*/

// i and j both from left
// i,j---------------->
int Partition2(int a[], int left, int right)
{
    // partition so that a[left..p-1]<=a[p] and a[p+1..right]>a[p]
    // left----i<=pivot, i----j>=pivot
;
    while (j <= right)
    {
        if (a[j] < pivot)
        {
            i++;
            myswap(a[i], a[j]);
        }
        j++;
    }
    myswap(a[left], a[i]);
    return i;
}

void QuickSort2(int a[], int left, int right)
{
    if(left < right) // less
    {
        int p = Partition2(a, left, right);
        QuickSort2(a, left, p - );
        QuickSort2(a, p + , right);
    }
}

void  QuickSort2(int a[], int n)
{
    QuickSort2(a, );
}

对于链表而言,借鉴(2)指针同向移动的思想容易改成如下代码。

【代码】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/5/30
*/

// i and j both from left
// i,j---------------->
node *Partition2_List(node *left, node *right)
{
    // partition so that a[left..p-1]<=a[p] and a[p+1..right]>a[p]
    // left----i<=pivot, i----j>=pivot
    node *pivot = left, *i = left , *j = left->next;
    while (j != right)
    {
        if (j->value < pivot->value)
        {
            i = i->next;
            myswap(i->value, j->value);
        }
        j = j->next;
    }
    myswap(left->value, i->value);
    return i;
}

void QuickSort2_List(node *left, node *right)
{
    if(left != right) // less
    {
        node *p = Partition2_List(left, right);
        QuickSort2_List(left, p);
        QuickSort2_List(p->next, right);
    }
}

void  QuickSort2_List(node *head)
{
    QuickSort2_List(head, NULL);
}

【参考】

http://blog.csdn.net/wumuzi520/article/details/8078322

【本文链接】

http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html

63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]的更多相关文章

  1. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  2. iOS常用算法之单链表查找倒数第n个节点(图解)

    拿到题目, 首先要先了解链表数据结构, 如下图: 常规思路: 利用数组, 遍历整个单链表, 将每个节点装入数组中, 最终拿到数组根据索引(数组长度-1-n)就得到了倒数第n个元素, 这里要注意从数组中 ...

  3. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

  4. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  5. 基于python实现单链表代码

    1 """ 2 linklist.py 3 单链表的构建与功能操作 4 重点代码 5 """ 6 7 class Node: 8 " ...

  6. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  7. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  8. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  9. 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏

    数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...

随机推荐

  1. 【HDU 1445】Ride to School

    题 题意 骑自行车,等0时开始最早出发的人,一起出发,然后被别人超过时,就追上去,终点距离是4.5km,速度单位是km/s,求到达的时间(s). 分析 贪心,找0时开始最早到的即可. 代码 #incl ...

  2. 【BZOJ-3293&1465&1045】分金币&糖果传递×2 中位数 + 乱搞

    3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 854  Solved: 476[Submit][Status] ...

  3. BZOJ-1003 物流运输trans SPFA+DP

    傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...

  4. UVA 11527 Unique Snowflakes

    用STL做会很方便 SET: /*by SilverN*/ #include<iostream> #include<algorithm> #include<cstring ...

  5. mint锁屏设置

    心血来潮,给笔记本装了linux,版本是当下最火的mint.唔,使用体验不错-下面记录的是修改mint锁屏相关设置的修改方式. In Linux Mint 13, the screen lock fe ...

  6. eclipse中运行python脚本中有注释为中文的内容,报错:SyntaxError: Non-ASCII character '\xe5'

    '''Created on 2015年7月2日 @author: liujuan'''import sysreload(sys) 以上为注释的有个日期中文的,结果运行报错:SyntaxError: N ...

  7. jquery------显示加载的js时出现中文乱码解决方法

    方法: 把my.js文件复制出来,用记事本打开,再另存为的时候设置编码格式为utf-8即可

  8. JSP 使用

    JSP教程: http://www.w3cschool.cc/jsp/jsp-tutorial.html jsp语法: 任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依 ...

  9. linux经典命令学习

    本文介绍Linux系统的若干经典命令的常用方法. (一)grep 主要用于搜索文件内容,查看是否跟要求的pattern相匹配. 1.grep -l 'boss' *        显示所有包含boss ...

  10. spring mvc实现查询

    实体类:User package cn.bdqn.pojo; public class User { private String userName; private String password; ...