常见排序算法及python实现

1、冒泡排序

冒泡排序的思想就是相邻元素两两比较,每一轮遍历把当前最大元素放到最后

def bubble_sort(seq):
    length = len(seq)  #获取seq长度
    for i in range(length):
        flag = True   #判断本轮seq是否发生改变的标志位
        for j in range(0, length-i-1):
            if seq[j] > seq[j+1]:  #相邻元素两两比较,较大的元素置于后面
                seq[j], seq[j+1] = seq[j+1], seq[j]
                flag = False   #确认本轮seq发生改变
        if flag:
            break  #若本轮未改变,则排序完成
    return seq

冒泡排序的平均时间复杂度为O(n^{2}),空间复杂度为O(1)

 

2、直接插入排序

直接插入排序的思想是把每一个元素与之前所有的元素进行比较,每一轮都能保证当前元素之前的部分是有序的

def insert_sort(seq):
    length = len(seq)   #获取seq长度
    for i in range(length-1):
        j = i+1
        while j > 0:
            if seq[j] < seq[j-1]: #比较相邻位置j,j-1的大小,进行排序
                seq[j-1], seq[j] = seq[j], seq[j-1]
            j -= 1 #j减1
    return seq

直接插入排序的平均时间复杂度为O(n^{2}),空间复杂度为O(1)

 

3、希尔排序

希尔排序(缩小增量排序)的思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序

def shell_sort(seq):
    length = len(seq)  #取seq长度
    gap = length // 2  #初始间隔
    while gap > 0:
        for i in range(0, gap): 
            for j in range(i, length-gap, gap):  #以i位置元素作为起始点,gap为间隔,取元素,
                while j >= 0 and seq[j] > seq[j+gap]:  #插入排序
                    seq[j], seq[j+gap] = seq[j+gap], seq[j]
                    j -= gap
        gap = gap // 2   #缩小间隔

    return seq

希尔排序的平均时间复杂度为O(nlog_{2}n),空间复杂度为O(1)

 

4、直接选择排序

选择排序,每次选择当前序列的最小值,将其与当前序列的第一个元素交换位置,每迭代一次,当前序列长度减一。迭代结束,即可得到有序序列。

def select_sort(seq):
    length = len(seq)
    for i in range(0, length-1):
        temp = i   #i为当前序列的第一个元素
        for j in range(i, length):
            if seq[j] < seq[temp]:
                temp = j
        seq[i], seq[temp] = seq[temp], seq[i]  #交换位置
    return seq

直接选择排序的平均时间复杂度为O(n^{2}),空间复杂度为O(1)

 

5、快速排序

快速排序的思想是分治。对于一个序列,首先从中选取一个数作为标准,小于这个数的值就被放在左边,大于这个数的值就被放在右边。然后,继续对左右两边进行快速排序。

快速排序在排序之前要打乱数组的顺序,使之随机排序。这对预测算法的运行时间特别重要,同时也是为了避免最坏情况的出现(第一次切分元素是最小值,第二次切分元素是第二小值,……)。

import random
def quicksort(seq):
    random.shuffle(seq)
    if len(seq) < 2:
        return seq
    else:
        left = []
        right = []
        base = []
        for item in seq:
            if item < seq[0]:
                left.append(item)
            elif item == seq[0]:
                base.append(item)
            else:
                right.append(item)
    return quicksort(left) + base + quicksort(right)

快速排序的平均时间复杂度为O(nlog_{2}n),空间复杂度为O(nlog_{2}n)

 

6、归并排序

归并排序的思想也是分治,但是与快速排序不同,快速排序每一次都会选择一个标准数对子序列进行粗排,然后再递归返回。归并把待排序序列分为若干个子序列,对子序列进行排序。然后再把有序子序列合并为整体有序序列。

def merge(a, b):  #元素逐个比较排序
    i, j = 0, 0
    c = []
    while i < len(a) and j < len(b):  
        if a[i] < b[j]:
            c.append(a[i])
            i += 1
        else:
            c.append(b[j])
            j += 1
    if i == len(a):
        for item in b[j:]:
            c.append(item)
    else:
        for item in a[i:]:
            c.append(item)
    return c


def merge_sort(seq):
    if len(seq) < 2:
        return seq
    mid = len(seq) // 2
    left = merge_sort(seq[0:mid])  #左支
    right = merge_sort(seq[mid:len(seq)])  #右支
    return merge(left, right)

归并排序的平局时间复杂度为O(nlog_{2}n),空间复杂度为O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值