算法的主要特征

算法應具備五大特征:有窮性、確切性、輸入項、輸出項和可行性。

這些特征確保算法是能夠在現實中被有效執行的。

算法的基本要素

數據對象的運算和操作

計算機的基本操作分為四類:

  1. 算術運算:加、減、乘、除。
  2. 邏輯運算:或、且、非。
  3. 關系運算:大于、小于、等于、不等于。
  4. 數據傳輸:輸入、輸出、賦值。

算法的控制結構

算法的功能不僅依賴于操作本身,還與操作的執行順序密切相關。良好的控制結構可以提高算法的效率。

算法的評價標準

算法的質量通常通過以下標準來評估:

  1. 時間復雜度:算法執行所需時間,通常表示為問題規模n的函數。
  2. 空間復雜度:算法執行所需的內存空間。
  3. 正確性:算法正確解決問題的能力。
  4. 可讀性:算法易于被人理解的程度。
  5. 健壯性:算法處理錯誤輸入的能力。

評價標準圖

十種經典排序算法

冒泡排序(Bubble Sort)

冒泡排序通過重復地遍歷待排序列,比較相鄰元素并交換錯誤順序的元素來進行排序。它的時間復雜度為O(n^2),在輸入數據已經有序時效率最高。

    def bubbleSort(nums):
        for i in range(len(nums) - 1):
            for j in range(len(nums) - i - 1):
                if nums[j] > nums[j+1]:
                    nums[j], nums[j+1] = nums[j+1], nums[j]
        return nums

冒泡排序動圖

選擇排序(Selection Sort)

選擇排序在每次遍歷中選擇最小的元素,放到已排序的序列末尾。其時間復雜度為O(n^2),不受輸入數據影響。

    def selectionSort(nums):
        for i in range(len(nums) - 1):
            minIndex = i
            for j in range(i + 1, len(nums)):
                if nums[j] < nums[minIndex]:
                    minIndex = j
            nums[i], nums[minIndex] = nums[minIndex], nums[i]
        return nums

選擇排序動圖

插入排序(Insertion Sort)

插入排序模擬整理撲克牌的手法,每次將新元素插入到已排序的部分中。雖然平均時間復雜度為O(n^2),但在部分有序序列中表現良好。

    def insertionSort(nums):
        for i in range(len(nums) - 1):
            curNum, preIndex = nums[i+1], i
            while preIndex >= 0 and curNum < nums[preIndex]:
                nums[preIndex + 1] = nums[preIndex]
                preIndex -= 1
            nums[preIndex + 1] = curNum
        return nums

插入排序動圖

希爾排序(Shell Sort)

希爾排序是插入排序的優化版本,通過比較距離較遠的元素來加快排序速度。它的時間復雜度為O(n log n)。

    def shellSort(nums):
        lens = len(nums)
        gap = 1
        while gap  0:
            for i in range(gap, lens):
                curNum, preIndex = nums[i], i - gap
                while preIndex >= 0 and curNum < nums[preIndex]:
                    nums[preIndex + gap] = nums[preIndex]
                    preIndex -= gap
                nums[preIndex + gap] = curNum
            gap //= 3
        return nums

希爾排序過程圖

歸并排序(Merge Sort)

歸并排序采用分治法,將序列遞歸拆分直至每部分僅含一個元素,然后合并排序。其時間復雜度為O(n log n),但需要額外內存。

    def mergeSort(nums):
        def merge(left, right):
            result = []
            i = j = 0
            while i < len(left) and j < len(right):
                if left[i] <= right[j]:
                    result.append(left[i])
                    i += 1
                else:
                    result.append(right[j])
                    j += 1
            result += left[i:] + right[j:]
            return result
        if len(nums) <= 1:
            return nums
        mid = len(nums) // 2
        left = mergeSort(nums[:mid])
        right = mergeSort(nums[mid:])
        return merge(left, right)

歸并排序動圖

快速排序(Quick Sort)

快速排序是基于分治法的高效排序算法,常用于大數據集。其時間復雜度平均為O(n log n),盡管最壞情況下為O(n2)。

    def quickSort(nums):
        if len(nums) <= 1:
            return nums
        pivot = nums[0]
        left = [x for x in nums[1:] if x = pivot]
        return quickSort(left) + [pivot] + quickSort(right)

快速排序動圖

其他排序算法

堆排序(Heap Sort)

堆排序將序列構建為大根堆或小根堆,通過調整堆結構進行排序。其時間復雜度為O(n log n)。

    def heapSort(nums):
        def adjustHeap(nums, i, size):
            lchild = 2 * i + 1
            rchild = 2 * i + 2
            largest = i
            if lchild  nums[largest]:
                largest = lchild
            if rchild  nums[largest]:
                largest = rchild
            if largest != i:
                nums[largest], nums[i] = nums[i], nums[largest]
                adjustHeap(nums, largest, size)
        def builtHeap(nums, size):
            for i in range(len(nums)//2)[::-1]:
                adjustHeap(nums, i, size)
        size = len(nums)
        builtHeap(nums, size)
        for i in range(len(nums))[::-1]:
            nums[0], nums[i] = nums[i], nums[0]
            adjustHeap(nums, 0, i)
        return nums

堆排序動圖

計數排序(Counting Sort)

計數排序為線性時間復雜度的排序算法,適用于值域不大的整數序列。

    def countingSort(nums):
        bucket = [0] * (max(nums) + 1)
        for num in nums:
            bucket[num] += 1
        i = 0
        for j in range(len(bucket)):
            while bucket[j] > 0:
                nums[i] = j
                bucket[j] -= 1
                i += 1
        return nums

計數排序動圖

桶排序(Bucket Sort)

桶排序是計數排序的升級版,適合均勻分布的數據。其效率取決于桶的數量和數據分布。

    def bucketSort(nums, defaultBucketSize=5):
        maxVal, minVal = max(nums), min(nums)
        bucketSize = defaultBucketSize
        bucketCount = (maxVal - minVal) // bucketSize + 1
        buckets = [[] for _ in range(bucketCount)]
        for num in nums:
            buckets[(num - minVal) // bucketSize].append(num)
        nums.clear()
        for bucket in buckets:
            insertionSort(bucket)
            nums.extend(bucket)
        return nums

基數排序(Radix Sort)

基數排序適用于多關鍵字排序,常用的LSD方法從低位到高位排序。

    def radixSort(nums):
        mod = 10
        div = 1
        mostBit = len(str(max(nums)))
        buckets = [[] for _ in range(mod)]
        while mostBit:
            for num in nums:
                buckets[num // div % mod].append(num)
            i = 0
            for bucket in buckets:
                while bucket:
                    nums[i] = bucket.pop(0)
                    i += 1
            div *= 10
            mostBit -= 1
        return nums

基數排序動圖

外部排序簡介

外部排序用于處理無法全部載入內存的大數據集,通常采用歸并排序法。其核心在于如何高效地進行子文件的劃分和歸并。

FAQ

  1. 問:什么是算法的時間復雜度?

  2. 問:如何選擇合適的排序算法?

  3. 問:什么是外部排序?

  4. 問:為什么快速排序通常優于歸并排序?

  5. 問:排序算法的穩定性如何判斷?

上一篇:

ChatGPT不回復:問題分析與解決方案

下一篇:

如何獲取ChatGPT API Key 密鑰并進行有效配置
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費