数据结构-链表快排

 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;
15 }
16
17 void QuickSort(Node *head, Node *tail){
18     if(head == tail)
19         return;
20     Node *temp = head;
21     for(Node *idx=head->next;idx!=tail;idx=idx->next){
22         if(head->num > idx->num){
23             temp=temp->next;
24             std::swap(temp->num, idx->num);
25         }
26     }
27     std::swap(head->num, temp->num);
28     QuickSort(head, temp);
29     QuickSort(temp->next, tail);
30 }
31
32 void Print(Node *head){
33     Node *cur = head;
34     while (cur!=NULL){
35         printf("%d ", cur->num);
36         cur=cur->next;
37     }
38     printf("\n");
39 }
40
41 int main(){
42     Node *head = NULL;
43     Add(&head, 1);
44     Add(&head, 2);
45     Add(&head, 3);
46     Add(&head, 4);
47     Add(&head, 5);
48     Add(&head, 6);
49     Add(&head, 7);
50     Add(&head, 8);
51     Print(head);
52     QuickSort(head, NULL);
53     Print(head);
54     return 0;
55 }
时间: 2024-10-19 19:43:22

数据结构-链表快排的相关文章

算法学习——单链表快排

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

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

以前只知道链表做插入(朴素.非二分)排序挺方便的.现在知道了(单)链表进行快速排序也是很好的(只是跟一般的快排的方式不一样). 参考: http://blog.csdn.net/otuhacker/article/details/10366563 我们只需要两个指针p和q,这两个指针均往next方向移动,移动的过程中保持p之前的key都小于选定的key,p和q之间的key都大于选定的key,那么当q走到末尾的时候便完成了一次支点的寻找.如下图所示:

链表快排

给定一个单向链表,在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

数据结构排序问题-------快排

快排实现基本思想:取个关键key值对整个序列进行比较,大的放一边,小的放另一边(这就分成两个序列了).然后继续对两个序列(分开的)进行递归比较,最后实现整个序列的排序. 最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n). package com; //快速排序 public class quick { //主函数实现排后的输出显示 public static void main(String[] args){ int[]a = {21,32,1,332,42,3,12,7

数据结构-排序-快排

快速排序 首先快速排序步骤: 首先选择轴值 把待排序内容分为两部分,左边为小于或者等于轴值,右边为大于轴值 然后对左右重复上面步骤直到整个序列有序 直接上代码这里先写一次划分的代码 这里的一次划分是那第一个数字为轴值,我们也可以用最后一个或者中间的. #include<iostream> #include<vector> using namespace std; //不含暂存单元的数组v1 int temp1[]={59,20,17,36,98,14,23,83,13,28}; v

单链表快排 改变节点位置

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

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

//快排,冒泡链表排序 #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 { //为了安全性

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

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

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

[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向.设头结点位head,则最后一个节点的next指向NULL.如果只知道头结点head,请问怎么将该链表排序? [分析] 对于数组的快排:有2种方式. (1)指针相向移动:一个指针i指向头,一个指针j指向尾,然后两个指针相向运动并按一定规律交换值,最后找到一个支点p使得支点左边的值小于支点,支点右边的值