溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

鏈表快排

發(fā)布時間:2020-07-31 11:48:16 來源:網(wǎng)絡(luò) 閱讀:432 作者:Jayce_SYSU 欄目:編程語言

給定一個單向鏈表,在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()
向AI問一下細節(jié)

免責(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)容。

AI