Linkedlist排序詳解

一、排序算法簡介

排序算法常見的有冒泡排序、插入排序、選擇排序、快速排序、歸併排序等。

冒泡排序:依次比較相鄰的兩個元素,如果滿足交換條件就交換,直到整個列表有序

插入排序:將數組分為有序和無序兩個區間,對於每個無序區間中的元素,將其插入到有序區間中的合適位置

選擇排序:依次選擇未排序的最小值,與已排序區間的下一個元素交換,直到整個列表有序

快速排序:隨機選取一個基準值,將小於基準值的數放在左邊,將大於基準值的數放在右邊,然後遞歸處理左邊和右邊的數列

歸併排序:將數組分為兩個有序區間,然後使用歸併算法將這兩個有序區間合併成一個有序區間

二、冒泡排序


def bubble_sort(self):
    if not self.head:
        return 
    cur = self.head 
    while cur:
        cmp = cur.next 
        while cmp:
            if cur.value > cmp.value:
                cur.value, cmp.value = cmp.value, cur.value 
            cmp = cmp.next 
        cur = cur.next 

冒泡排序的時間複雜度為O(n^2),空間複雜度為O(1)

三、插入排序


def insert_sort(self):
    if not self.head:
        return 
    dummy = ListNode(0)
    dummy.next = self.head  
    cur = self.head 
    while cur.next:
        if cur.value <= cur.next.value:
            cur = cur.next 
        else:
            temp = cur.next 
            cur.next = temp.next
            pre = dummy 
            while pre.next.value <= temp.value:
                pre = pre.next 
            temp.next = pre.next 
            pre.next = temp 
    self.head = dummy.next 

插入排序的時間複雜度為O(n^2),空間複雜度為O(1)

四、選擇排序


def select_sort(self):
    if not self.head:
        return 
    cur = self.head 
    while cur:
        min_node = cur 
        cmp = cur.next 
        while cmp:
            if cmp.value < min_node.value:
                min_node = cmp 
            cmp = cmp.next 
        cur.value, min_node.value = min_node.value, cur.value 
        cur = cur.next 

選擇排序的時間複雜度為O(n^2),空間複雜度為O(1)

五、快速排序


def quick_sort(self, head, tail):
    if not head or head == tail:
        return head 
    pivot = head.value 
    slow = fast = head 
    while fast != tail:
        if fast.value < pivot:
            slow = slow.next 
            slow.value, fast.value = fast.value, slow.value 
        fast = fast.next 
    slow.value, head.value = head.value, slow.value 
    self.quick_sort(head, slow)
    self.quick_sort(slow.next, tail)

快速排序的時間複雜度為O(nlogn),空間複雜度為O(logn)

六、歸併排序


def merge(self, l1, l2):
    dummy = ListNode(0)
    tail = dummy 
    while l1 and l2:
        if l1.value <= l2.value:
            tail.next, l1 = l1, l1.next 
        else:
            tail.next, l2 = l2, l2.next 
        tail = tail.next 
    if l1:
        tail.next = l1 
    else:
        tail.next = l2 
    return dummy.next 

def merge_sort(self, head, tail):
    if not head:
        return head 
    if head.next == tail:
        head.next = None 
        return head 
    slow = fast = head 
    while fast != tail:
        slow = slow.next 
        fast = fast.next 
        if fast != tail:
            fast = fast.next 
    mid = slow 
    return self.merge(self.merge_sort(head, mid), self.merge_sort(mid, tail))

歸併排序的時間複雜度為O(nlogn),空間複雜度為O(logn)

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/241163.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:26
下一篇 2024-12-12 12:26

相關推薦

  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25

發表回復

登錄後才能評論