タイトル説明
元のタイトルリンク
時の複雑さ:
マスター定理を得ることができる
空間的複雑。
多くのスタック領域を取ります
説明:
- それはソートに基づいていないので、クイックソート、単一の書き込みは、ソートが安定していることを保証することができます以下のリストは、この配列からすばやくソート異なる交換しました
- 必要な時間複雑であれば 、空間的複雑 、反復の形で使用されなければならないソートマージ
C ++コード
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getTail(ListNode *head) {
while (head->next)
head = head->next;
return head;
}
ListNode *quickSortList(ListNode *head) {
// 遍历链表,按照三种情况分别加到三个链表中
// 空结点或单结点
if (!head || !head->next) return head;
ListNode *lhead = new ListNode(-1), *mhead = new ListNode(-1), *rhead = new ListNode(-1);
auto left = lhead, mid = mhead, right = rhead;
// 遍历链表
int x = head->val;
for (auto p = head; p; p = p->next) {
if (p->val < x)
left = left->next = p;
else if (p->val == x)
mid = mid->next = p;
else
right = right->next = p;
}
// 得到三个链表,递归左边和右边链表
left->next = mid->next = right->next = nullptr;
lhead->next = quickSortList(lhead->next);
rhead->next = quickSortList(rhead->next);
// 拼接链表
getTail(lhead)->next = mhead->next;
getTail(mhead)->next = rhead->next;
auto re = lhead->next;
delete lhead;
delete mhead;
delete rhead;
return re;
}
};
完全なコード
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x)
: val(x)
, next(NULL) {
}
};
// create linked list, -1 means NULL
ListNode *createList() {
int d;
cin >> d;
if (d == -1) return NULL;
ListNode *head = new ListNode(d);
head->next = createList();
return head;
}
ListNode *getTail(ListNode *head) {
while (head->next)
head = head->next;
return head;
}
ListNode *quickSortList(ListNode *head) {
// 遍历链表,按照三种情况分别加到三个链表中
// 空结点或单结点
if (!head || !head->next) return head;
ListNode *lhead = new ListNode(-1), *mhead = new ListNode(-1), *rhead = new ListNode(-1);
auto left = lhead, mid = mhead, right = rhead;
// 遍历链表
int x = head->val;
for (auto p = head; p; p = p->next) {
if (p->val < x)
left = left->next = p;
else if (p->val == x)
mid = mid->next = p;
else
right = right->next = p;
}
// 得到三个链表,递归左边和右边链表
left->next = mid->next = right->next = nullptr;
lhead->next = quickSortList(lhead->next);
rhead->next = quickSortList(rhead->next);
// 拼接链表
getTail(lhead)->next = mhead->next;
getTail(mhead)->next = rhead->next;
auto re = lhead->next;
delete lhead;
delete mhead;
delete rhead;
return re;
}
int main() {
auto head = createList();
head = quickSortList(head);
while (head) {
cout << head->val << " ";
head = head->next;
}
return 0;
}
最後に書かれたブログは思考の知識をまとめたコンピュータサイエンスの分野を中心に、レビューは、私の目標を理解することは容易である各ブログを書くために、:技術と知識を共有することは喜びである、と私はみんなを歓迎します一緒に学習の交換をして、そこにコメントエリアには疑問もありませんが、またあなた(^∀^●)との深い交流を楽しみにすることができます