Python 3.x 为什么桶排序的时间复杂度是O(n^2)而不是O(log(n)*n^2)? 导入数学 def插入端口(arr): 对于范围内的i(len(arr)-1): 对于范围(i+1,len(arr))内的j: 如果arr[j]

Python 3.x 为什么桶排序的时间复杂度是O(n^2)而不是O(log(n)*n^2)? 导入数学 def插入端口(arr): 对于范围内的i(len(arr)-1): 对于范围(i+1,len(arr))内的j: 如果arr[j],python-3.x,sorting,data-structures,bucket-sort,Python 3.x,Sorting,Data Structures,Bucket Sort,插入排序本身是一个O(n^2)操作,外循环到达元素数的sqaure根,即O(sqrt(n)),因此它应该是O(log(n)*n^2 插入排序本身是一个O(n^2)操作,外循环到达元素数的sqaure根,即O(sqrt(n)),因此它应该是O(log(n)*n^2 您已经给出了一个论点,为什么时间复杂度可能是O(n2.5),而不是O(log(n)*n^2),尽管有一个相对简单的原因,为什么它们都不是紧上界(松上界没有错,但不太有趣,在某些上下文中可能被视为错) 项目总数仍然只有n。 在最坏的情况下

插入排序本身是一个O(n^2)操作,外循环到达元素数的sqaure根,即O(sqrt(n)),因此它应该是O(log(n)*n^2

插入排序本身是一个O(n^2)操作,外循环到达元素数的sqaure根,即O(sqrt(n)),因此它应该是O(log(n)*n^2

您已经给出了一个论点,为什么时间复杂度可能是O(n2.5),而不是O(log(n)*n^2),尽管有一个相对简单的原因,为什么它们都不是紧上界(松上界没有错,但不太有趣,在某些上下文中可能被视为错)

项目总数仍然只有
n
。 在最坏的情况下,所有项目都在一个桶中,这就是O(n²)时间复杂性的来源。所有其他项目在桶上的分布都更好。桶不可能都是大的,这是你的论点隐含的假设

这就是为什么经验法则“乘以嵌套循环的时间复杂性”只是一个经验法则。

sqrt(n)不是O(log(n))。对数的增长速度比多项式慢得多。
import math

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


def bucketSort(arr):    
    no_of_buck =  round(math.sqrt(len(arr)))
    bucketArr = [[] for _ in range(no_of_buck)]
    n = len(bucketArr)
    maximumVal = max(arr)

    for i in arr:
        appropriate_bucket = math.ceil(i * n / maximumVal)
        bucketArr[appropriate_bucket-1].append(i)
    
    for i in bucketArr:
        i = insertionSort(i)
    
    arr = []
    for i in bucketArr:
        arr.extend(i)

    print(arr)