您好,登錄后才能下訂單哦!
給定一個單向鏈表,在O(1)空間復(fù)雜度和O(nlogn)時間復(fù)雜度下進行排序
# -*- 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/SysuJayce
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def linkedListQuickSort(head):
sort_helper(head, None)
return head
def sort_helper(head, end):
"""
快排本質(zhì)上來講就是選擇一個主元,比主元小的值都放到主元左邊(以升序為例),其他都放到右邊
因此不論是數(shù)組還是鏈表,快排的遞歸代碼是一樣的
"""
# 由于我們這里判斷了head是否和end相等來作為遞歸的出口,因此不必向數(shù)組那樣判斷下標(biāo)起止點的大小
# 來作為遞歸出口
if head != end:
pivot = quick_sort(head)
sort_helper(head, pivot)
sort_helper(pivot.next, end)
def quick_sort(head):
# 由于在鏈表中我們不能像數(shù)組那樣選擇一個下標(biāo)來作為主元位置,因此就選擇待排序鏈表的第一個元素作
# 為主元即可。
fast, slow = head.next, head # slow是用來標(biāo)記比主元小的元素應(yīng)在的位置,fast用來遍歷
while fast:
# 當(dāng)發(fā)現(xiàn)有元素比主元(head)的值小的時候,我們先確定這個元素應(yīng)該在的節(jié)點,然后將當(dāng)前節(jié)點
# 的值和應(yīng)該在的節(jié)點的值交換
if fast.val < head.val:
slow = slow.next
slow.val, fast.val = fast.val, slow.val
fast = fast.next
# 最后將主元的值放到正確的節(jié)點上
slow.val, head.val = head.val, slow.val
# 返回主元所在的節(jié)點
return slow
def main():
head = ListNode(3)
head.next = ListNode(4)
head.next.next = ListNode(2)
head.next.next.next = ListNode(5)
head = linkedListQuickSort(head)
while head:
print(head.val)
head = head.next
if __name__ == '__main__':
main()
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。