单链表排序——快速排序实现

利用快速排序,同向一前一后两个指针

#ifndef LIST_H_
#define LIST_H_

#include <iostream>
#include <utility>

class List {
private:
	struct ListNode {
		int _value;
		ListNode* _next;
	};

public:
	List(): _head(nullptr) {}

	~List() {
		while (nullptr != _head) {
			auto tmp = _head;
			_head = _head->_next;
			delete tmp;
		}
	}

	// 插入
	void PushBack(int value) {
		if (nullptr == _head) {
			ListNode* tmp = new ListNode();
			tmp->_value = value;
			tmp->_next = nullptr;
			_head = tmp;
		} else {
			ListNode* current = _head;

			while (nullptr != current->_next) {
				current = current->_next;
			}

			ListNode* tmp = new ListNode();
			tmp->_value = value;
			tmp->_next = nullptr;
			current->_next = tmp;
		}
	}

	// 排序
	void Sort() {
		QuickSort(_head, nullptr);
	}

	// 显示
	void Display() const {
		auto current = _head;

		while (nullptr != current) {
			std::cout << current->_value << " ";
			current = current->_next;
		}
		std::cout << std::endl;
	}

private:
	void QuickSort(ListNode* first, ListNode* last) {
		if (first != last) {
			ListNode* pivotPtr = Partition(first, last);
			QuickSort(first, pivotPtr);
			QuickSort(pivotPtr->_next, last);
		}
	}

	ListNode* Partition(ListNode* first, ListNode* last) {
		const int pivot = first->_value;
		ListNode* i = first;
		ListNode* j = first->_next;

		while (j != last) {
			if (j->_value <= pivot) {
				i = i->_next;
				std::swap(i->_value, j->_value);
			}
			j = j->_next;
		}
		std::swap(first->_value, i->_value);

		return i;
	}

	ListNode* _head;
};

#endif // LIST_H_
时间: 2024-10-06 00:16:26

单链表排序——快速排序实现的相关文章

148. Sort List (java 给单链表排序)

题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1).时间复杂度为O(nlogn)的排序算法有快速排序和归并排序, 但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路. 编码: public ListNode sortList(ListNode head) { if(hea

笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)

void BubbleSortNode(SListNode *&pHead)//单链表排序 {  assert(pHead);  SListNode *tail = NULL;  int Bool = 0;  //若没有进行交换提前返回  while (tail!=pHead->next)  {   Bool = 0;   SListNode *tmp = pHead;   SListNode *tmpnext = tmp->next;   while (tmp->next !=

将单链表排序的两种方法

对单链表排序,通常有两种方法.(PS:考察一个程序员的C语言编程功底,通常看他是否能娴熟的操作链表就知道了.) 方法1:将每一个结点保存到额外的数组中,对数组进行排序,然后根据有序的数组重新构建链表. 方法2:直接对链表进行插入排序,但是实现起来比较复杂一些. 显然,方法1最为简单,因为将链式存储L先转化为顺序存储a[],对顺序存储a[]排序,就避免了较为复杂的链接指针操作.一旦对顺序存储a[]排好序后,根据a[]重新构建一个链表是易如反掌的事情. 1. 单链表的定义如下 typedef str

12.单链表排序

12.单链表排序 思路: 参见基本函数13://冒泡排序链表,具体的做法是“狸猫换太子”,即只交换节点中的值,对链表结构不做改动. void sortList(Node*& Head); //链表排序 //排序的方法是不破坏结构,有“狸猫换太子”的意思,只进行value的交换,不破坏链表结构 void sortList(Node*& Head) {   int count=numOfNodes(Head);   if(count==0||count==1)   {    return ;

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

本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space complexity. 题目要求我们在O(n log n)时间复杂度下完成对单链表的排序,我们知道平均时间复杂度为O(n log n)的排序方法有快速排序.归并排序和堆排序.而一般是用数组来实现二叉堆,当然可以用二叉树来实现,但是这么做太麻烦,还得花费额外的空间构建二叉树,于是不采用堆排序. 故本

单链表排序(插入与归并)

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; /* * 单链表的插入排序, 插入排序是一种稳定排序 */ class Solution7 { public: ListNode* insertionSortList(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode *

单链表的快速排序(转)

单链表的特点是:单向.设头结点位head,则最后一个节点的next指向NULL.如果只知道头结点head,请问怎么将该链表排序? 设结点结构为 struct Node{ int key; Node* next; }; 那么一般人见到这种题目,立马就会想到指针交换.是的,大家被指针交换的题目做多了,形成思维定势了.对于这道题,我们完全可以利用值交换来达到排序的目的. 当然,怎么值交换? 很多人得第一想法就是选择排序,这个木有问题,不过它的复杂度为O(n^2):有木有更好一点的方法呢?归并,不错,归

奇数结点升序偶数结点降序的单链表排序(Python实现)

题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3->4->5->6->7->8 解析 按照以下步骤处理: 按照奇偶位拆分为两个链表 反转偶数结点构成的链表 合并两个递增链表 Python实现 # -*- coding:utf-8 -*- class Node(object): def __init__(self, val=None

单链表排序--归并排序

#include <iostream> #include <cstdlib> using namespace std; struct ListNode //默认为public { int data; ListNode* next; ListNode(int x, ListNode* nextNode):data(x), next(nextNode){} }; ListNode* mergeData(ListNode* first, ListNode* second) { if(fi