有没有这样的名称,对排序有效的是哪种数据?

时间:2019-03-15 09:39:57

标签: python sorting

我正试图从火车上的记忆中编写一个冒泡排序,以便今天早上开始工作,但是我提出了这个建议。

这种类型的名称吗?

def not_bubble_sort(arr):
    length = len(arr)
    while True:
        is_sorted = True
        for i in range(length - 1):
            if arr[i] > arr[i + 1]:
                is_sorted = False
                arr[i], arr[i + 1] = arr[i + 1], arr[i]
        if is_sorted:
            break

    return arr

对于某些数据,我希望它效率极低。但是对于其他随机生成的列表,它的速度非常快,有人可以解释为什么。有没有办法利用它?还是我在某个地方犯了错误。

我针对实际的气泡排序运行了一些基准测试,发现对于某些类型的随机生成的列表而言,这要快得多。

基准测试对生成的n个randint整数列表进行排序。

N = 5000
------
|  min          |  avg          |  max          |  func             |  name             |
|---------------|---------------|---------------|-------------------|-------------------|
|  0.000463724  |  0.034745610  |  3.425408840  |  not_bubble_sort  |  sarcoma          |
|  1.159517288  |  1.212791989  |  1.768434763  |  bubble_sort      |  geeks_for_geeks  |

怪胎怪胎示例冒泡排序:


def bubble_sort(arr):
    n = len(arr)

    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

    return arr

https://github.com/sarcoma/algorithms-python/blob/master/algorithms/sort/bubble_sort.py

1 个答案:

答案 0 :(得分:4)

这只是气泡排序,但提前退出。

在“真实”气泡排序中,无论数据是什么样,您都要遍历数组length-1次,但是在这里,如果在较早的步骤中对数据进行了排序,则您break

效率低下是因为您的算法的复杂度为“ O(n ^ 2)”,而不是“ O(1/2 * n ^ 2)” *(因为此for i in range(length - 1):而不是此{{ 1}})

*不是真正的大O表示法,但证明了这一点