冒泡排序和快速排序

作者: 程序员Darker | 来源:发表于2019-04-24 15:36 被阅读5次

冒泡排序

  • 冒泡排序是一种比较简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们顺序错误就调换。
  • 冒泡排序的算法实现:
    1. 比较相邻的两个元素,如果第一个比第二个大(升序排列),就交换它们两个的位置。
    2. 对每一对相邻的元素做同样的工作,从第一对到结尾的最后一对。这时zuihou最后的元素将会是最大的数。
    3. 针对所有的元素,重复以上的步骤,除了结尾已排序好的。直到没有任何一对数字需要比较。
  • python代码实现
import random, time

# 随机生成一个列表,里面有10000个数字
data = [random.randint(10, 10000) for i in range(10000)]

# 冒泡排序
def bubble(data):
    for i in range(len(data) - 1, 0, -1):
        for j in range(i):
            if data[j] > data[j + 1]:
                data[j], data[j + 1] = data[j + 1], data[j]

# 统计排序用了多久时间
start = time.time()
bubble(data)
end = time.time()
print(end - start)

耗时:7.338299751281738秒

快速排序

  • 快速排序又称为划分交换排序
    1.通过一趟排序将要排序的数据分割成独立的两部分
    2.其中一部分的所有数据都比另外一部分的所有数据都要小
    3.然后再按照此方法对这两部分数据分别进行快速排序
    4.然后整个过程可以递归进行,以此达到整个数据变成有序序列

  • 实现步骤:
    1.从数列中挑出一个元素为“基准”
    2.重归排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任意一边),在这个分区结束后该基准就处于数列的中间位置。这个称为分区操作。
    3.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。


    快速排序.PNG
  • python代码实现方式一

# 随机生成一个列表
data = [random.randint(10, 10000) for i in range(10000)]
# 快速排序方式一
def quick_sort(data):
    left, middle, right = [], [], []
    if len(data) > 1:
        pivot = data[0]
        for i in data:
            if i < pivot:
                left.append(i)
            elif i == pivot:
                middle.append(i)
            else:
                right.append(i)
        return quick_sort(left) + middle + quick_sort(right)
    else:
        return data


start = time.time()
quick_sort(data)
end = time.time()
print(end - start)

耗时:0.016863584518432617秒

  • python代码实现二
# 随机生成一个列表
data = [random.randint(10, 10000) for i in range(10000)]
# 快速排序方式二
def quick2_sort(data: list, start: int, end: int):
    # 递归的退出条件
    if start >= end:
        return

    # 设定起始元素为要寻找位置的基准元素
    mid = data[start]

    # low为序列左边的由左向右移动的游标
    low = start

    # high为序列右边的由右向左移动的游标
    high = end

    while low < high:
        # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动
        while low < high and data[high] >= mid:
            high -= 1
        # 将high指向的元素放到low的位置上
        data[low] = data[high]

        # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
        while low < high and data[low] < mid:
            low += 1
        # 将low指向的元素放到high的位置上
        data[high] = data[low]

    # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
    # 将基准元素放到该位置
    data[low] = mid

    # 对基准元素左边的子序列进行快速排序
    quick2_sort(data, start, low - 1)

    # 对基准元素右边的子序列进行快速排序
    quick2_sort(data, low + 1, end)


start = time.time()
quick2_sort(data, 0, 10000 - 1)
end = time.time()
print(end - start)

耗时:0.01979970932006836秒

冒泡排序和快速排序的对比

同样的一组数据,快速排序所需要的时间比冒泡排序快的太多了

排序算法总结

排序算法总结.PNG

相关文章

网友评论

    本文标题:冒泡排序和快速排序

    本文链接:https://www.haomeiwen.com/subject/ttrggqtx.html