python3 数据结构和算法(1) 排序

48 篇文章 0 订阅

0.util

import random
import time
from functools import wraps

def timethis(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print('%-30s %10s %f' % (func.__name__, ' cost time:', end - start))
        return result
    return wrapper

def dump(array):
    for i in range(0, len(array)):
        print(array[i], end=', ')
    print()


def same(arr1, arr2):
    if len(arr1) != len(arr2):
        return False

    for i in range(0, len(arr1)):
        if arr1[i] != arr2[i]:
            return False
    return True

def check_sorted(array):
    s = sorted(array)
    if s != array:
        print('error')

1.插入排序(insertion sort)

def insertion_sort(array, g):
    for i in range(g, len(array)):
        v = array[i];
        j = i - g
        while j >= 0 and array[j] > v:
            array[j+g] = array[j]
            j -= g
        array[j+g] = v

@timethis
def test_insertion_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        insertion_sort(array, 1)
        check_sorted(array)

2.冒泡排序(bubble sort)

def bubble_sort(a):
    for i in range(len(a)):
        flag = False
        for j in range(len(a)-1, i, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]
                flag = True

        if not flag:
            break

@timethis
def test_bubble_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        bubble_sort(array)
        check_sorted(array)

3.选择排序(selection sort)

def selection_sort(a):
    for i in range(len(a)-1):
        m = i
        for j in range(i+1, len(a)):
            if a[j] < a[m]:
                m = j
        a[i], a[m] = a[m], a[i]

@timethis
def test_selection_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        selection_sort(array)
        check_sorted(array)

4.希尔排序(shell sort)

def shell_sort(a, gn):
    for g in reversed(gn):
        insertion_sort(a, g)


@timethis
def test_shell_sort():
    n, h = 1000, 1
    gn = []
    while h <= n:
        gn.append(h)
        h = 3*h + 1

    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        shell_sort(array, gn)
        check_sorted(array)

5.归并排序(merge sort)

def merge(a, l, m, r):
    al = a[l : m+1]
    ar = a[m+1 : r+1]

    al.append(float('INF'))
    ar.append(float('INF'))

    i, j = 0, 0
    for k in range(l, r+1):
        if al[i] < ar[j]:
            a[k] = al[i]
            i += 1
        else:
            a[k] = ar[j]
            j += 1

def merge_sort(a, l, r):
    if l < r:
        m = (l + r) // 2
        merge_sort(a, l, m)
        merge_sort(a, m+1, r)
        merge(a, l, m, r)


@timethis
def test_merge_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        merge_sort(array, 0, len(array)-1)
        check_sorted(array)

6.快速排序(quick sort)

def partition(a, l, r):
    x = a[r]
    i = l - 1
    for j in range(l, r):
        if a[j] <= x:
            i += 1
            a[i], a[j] = a[j], a[i]
    a[i+1], a[r] = a[r], a[i+1]
    return i+1

def quick_sort(a, l, r):
    if l < r:
        p = partition(a, l, r)
        quick_sort(a, l, p-1)
        quick_sort(a, p+1, r)



@timethis
def test_quick_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        quick_sort(array, 0, len(array)-1)
        check_sorted(array)

7.计数排序(counting sort)

def counting_sort(a, max_val):
    count = [0] * (max_val+1)
    for v in a:
        count[v] += 1

    j = 0
    for i in range(max_val+1):
        for c in range(count[i]):
            a[j] = i
            j += 1

@timethis
def test_counting_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        counting_sort(array, 10000)
        check_sorted(array)

8.堆排序(heap sort)

def heapify(a, i, heap_size):
    l = (i+1) * 2 - 1
    r = (i+1) * 2

    largest = i
    if l < heap_size and a[l] > a[largest]:
        largest = l
    if r < heap_size and a[r] > a[largest]:
        largest = r

    if largest != i:
        a[i], a[largest] = a[largest], a[i]
        heapify(a, largest, heap_size)

def build_heap(a):
    heap_size = len(a)
    for i in range(len(a)//2, -1, -1):
        heapify(a, i, heap_size)

def heap_sort(a):
    build_heap(a)
    for i in range(len(a)-1, 0, -1):
        a[0], a[i] = a[i], a[0]
        heapify(a, 0, i)

@timethis
def test_heap_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        heap_sort(array)
        check_sorted(array)
@timethis
def test_buildin_sort():
    for i in range(10):
        array = [ random.randint(1, 10000) for i in range(1000) ]
        array = sorted(array)


def test_sort():
    test_buildin_sort()
    test_insertion_sort()
    test_bubble_sort()
    test_selection_sort()
    test_shell_sort()
    test_merge_sort()
    test_quick_sort()
    test_counting_sort()
    test_heap_sort()

def main():
    test_sort()

if __name__ == '__main__':
    main()

test_buildin_sort cost time: 0.013457
test_insertion_sort cost time: 0.278185
test_bubble_sort cost time: 0.633724
test_selection_sort cost time: 0.274748
test_shell_sort cost time: 0.030936
test_merge_sort cost time: 0.036765
test_quick_sort cost time: 0.026572
test_counting_sort cost time: 0.032006
test_heap_sort cost time: 0.049690

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构算法(Python) 一、引入概念 1-01算法引入 1-02 时间复杂度与大O表示法 1-03-最坏时间复杂度与计算规则 1-04-常见时间复杂度与大小关系 1-05-代码执行时间测量模块 1-06-Python列表类型不同操作的时间效率 1-07-Python列表与字典操作的时间复杂度 1-08-数据结构引入 二、顺序表 2-01 内存、类型本质、连续存储 recv 2-02 基本顺序表与元素外围顺序表 recv 2-03 顺序表的一体式结构与分离式结构 recv 2-04 顺序表数据区替换与扩充 recv 三、栈 3-01 栈与队列的概念 3-02 栈的实现 3-03 队列与双端队列的实现 四、链表 4-01 链表的提出 4-02 单链表的ADT模型 4-03 Python中变量标识的本质 4-04 单链表及结点的定义代码 4-05 单链表的判空、长度、遍历与尾部添加结点的代码实现 4-06 单链表尾部添加和在指定位置添加 4-07 单链表查找和删除元素 4-08 单链表与顺序表的对比 4-09 单向循环链表遍历和求长度 4-10 单向循环链表添加元素 4-11 单向循环链表删除元素 4-12 单向循环链表删除元素复习及链表扩展 4-13 双向链表及添加元素 4-14 双向链表删除元素 五、排序与搜索 5-01 排序算法的稳定性 5-02 冒泡排序及实现 5-03 选择排序算法及实现 5-04 插入算法 5-05 插入排序 5-06 插入排序2 5-07 希尔排序 5-08 希尔排序实现 5-09 快速排序 5-10 快速排序实现1 (1) 5-10 快速排序实现1 5-11 快速排序实现2 5-12 归并排序 5-13 归并排序 代码执行流程 5-14 归并排序时间复杂度及排序算法复杂度对比 5-15 二分查找 5-16 二分查找时间复杂度 六、树和树的算法 6-01 树的概念 6-02 二叉树的概念 6-03 二叉树的广度优先遍历 6-04 二叉树的实现 6-05 二叉树的先序、中序、后序遍历 6-06 二叉树由遍历确定一棵树 ———————————————— 版权声明:本文为CSDN博主「dwf1354046363」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dwf1354046363/article/details/119832814

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值