数据结构与算法-排序(二)

希尔排序


  • 基本排序

将原本有大量记录数的记录进行分组。分割成若干序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录执行一次直接插入排序。其时间复杂度为O(n**3/2),突破了O(n*n)。

快速排序


  • 基本思想

快速排序是基于一种“二分”的思想,相比较冒泡排序,总的比较和交换的次数减少。核心是设置基准点,跳跃式交换,平均时间复杂度为O(NlogN)。

代码实现(python)

import random


def shell_sort(test_list):
    increment = len(test_list)

    while increment > 1:
        # increment分割的序列
        increment = increment/5 + 1
        # 以下就是直接插入排序的代码 
        for i in range(increment, len(test_list)):
            # 每一个子序列都设定一个基准
            temp = test_list[i]
            j = i - 1
            while j >= 0 and test_list[j] > temp:
                test_list[j + 1] = test_list[j]
                j -= 1
            test_list[j + 1] = temp

    return test_list


def quick_sort(arr, left, right):

    if left > right:
        return
    # temp存的基准数
    temp = arr[left]
    pivot_index = left
    pivot_end = right

    while pivot_index != pivot_end:

        # 先从右往左找大于基准数的数
        while arr[pivot_end] >= temp and pivot_index < pivot_end:
            pivot_end -= 1

        # 再从左往右找小于基准数的数
        while arr[pivot_index] <= temp and pivot_index < pivot_end:
            pivot_index += 1

        # 交换两个数在数组中的位置
        if pivot_index < pivot_end:
            arr[pivot_index], arr[pivot_end] = arr[pivot_end], arr[pivot_index]

    # 将基准位置归位
    arr[left], arr[pivot_index] = arr[pivot_index], arr[left]

    # 继续处理左边的,这是一个递归的过程
    quick_sort(arr, left, pivot_index - 1)
    # 继续处理右边的,这是一个递归的过程
    quick_sort(arr, pivot_index + 1, right)

    return arr

if __name__ == '__main__':
    quick_list = [random.randint(1, 100) for _ in range(100)]
    print(quick_sort(quick_list, 0, len(quick_list)-1))

    shell_list = [random.randint(1, 100) for _ in range(100)]
    print(quick_sort(shell_list, 0, len(shell_list)-1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值