溫馨提示×

溫馨提示×

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

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

鏈表快排

發布時間:2020-07-31 11:48:16 來源:網絡 閱讀:468 作者:Jayce_SYSU 欄目:編程語言

給定一個單向鏈表,在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/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):
    """
    快排本質上來講就是選擇一個主元,比主元小的值都放到主元左邊(以升序為例),其他都放到右邊
    因此不論是數組還是鏈表,快排的遞歸代碼是一樣的
    """
    # 由于我們這里判斷了head是否和end相等來作為遞歸的出口,因此不必向數組那樣判斷下標起止點的大小
    # 來作為遞歸出口
    if head != end:
        pivot = quick_sort(head)
        sort_helper(head, pivot)
        sort_helper(pivot.next, end)

def quick_sort(head):
    # 由于在鏈表中我們不能像數組那樣選擇一個下標來作為主元位置,因此就選擇待排序鏈表的第一個元素作
    # 為主元即可。
    fast, slow = head.next, head  # slow是用來標記比主元小的元素應在的位置,fast用來遍歷
    while fast:
        # 當發現有元素比主元(head)的值小的時候,我們先確定這個元素應該在的節點,然后將當前節點
        # 的值和應該在的節點的值交換
        if fast.val < head.val:
            slow = slow.next
            slow.val, fast.val = fast.val, slow.val

        fast = fast.next

    # 最后將主元的值放到正確的節點上
    slow.val, head.val = head.val, slow.val
    # 返回主元所在的節點
    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問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女