Python 八大排序算法合集

1、选择排序

选择排序(升序)【不稳定排序】。

原理:

  1. 给定一个列表,经过第一轮比较后,找到最小值,与第一个位置交换;
  2. 接着对不包括第一个元素的剩下的元素,找到最小值,与第二个位置交换;
  3. 重复该过程,直到进行比较的记录只有一个为止;

以 list = [5, 4, 2, 1, 3] 为例:

第一次排序后: [1, 4, 2, 5, 3]

第二次排序后: [1, 2, 4, 5, 3]

第三次排序后: [1, 2, 3, 5, 4]

第四次排序后: [1, 2, 3, 4, 5]

时间复杂度:O(n**2)

空间复杂度:O(1) 

算法实现: 

def select_sort(lists):
'''
:param lists:
:return: lists
'''

    count = len(lists)
    for i in range(0, count):
        min = i
        for j in range(i + 1, count):
            if lists[min] > lists[j]:
                min = j
        lists[min], lists[i] = lists[i], lists[min]
    return lists

# 调用选择排序
select_sort_list = select_sort(lis)
print(select_sort_list)

2、插入排序

插入排序(升序)【稳定排序】。

原理:

  1. 假设初始时假设第一个记录,自成一个有序序列,其余的记录为无序序列;
  2. 从第二个记录开始,按记录大小,依次插入之前的有序序列中;
  3. 直到最后一个记录插入到有序序列中为止;

以 list = [5, 4, 2, 1, 3] 为例:

第一步,插入5之后: [5], 4, 2, 1, 3

第二步,插入4之后: [4, 5], 2, 1, 3

第三步,插入2之后: [2, 4, 5], 1, 3

第四步,插入1之后: [1, 2, 4, 5], 3

第五步,插入3之后: [1, 2, 3, 4, 5]

时间复杂度: O(n) ~ O(n**2) 平均: O(n**2)

空间复杂度: O(1) 

算法实现: 

def insert_sort(lists):
'''
:param lists:
:return: lists
'''

    count = len(lists)
    for i in range(1, count):
        key = lists[i]
        j = i - 1
        while j >= 0:
            if lists[j] > key:
                lists[j+1] = lists[j]
                lists[j] = key
            j -= 1
    return lists

# 调用插入排序
insert_sort_list = insert_sort(lis)
print(insert_sort_list)

3、冒泡排序

冒泡排序(升序)【稳定排序】

原理:

  1. 从第一个元素开始,开始依次对相邻的两个元素进行比较,当后面的元素大于前面,则交换位置;
  2. 进行一轮比较之后,最大的元素将在序列尾部(最后一位);
  3. 然后对(n-1)个元素再进行第二轮比较,最大元素将在序列倒数第二位;
  4. 重复该过程,直至只剩下最后一个元素为止,最后的元素就是最小值,排在序列首;

以 list = [5, 4, 2, 1, 3] 为例:

第一轮排序: [4, 2, 1, 3, 5]

第二轮排序: [2, 1, 3, 4, 5]

第三轮排序: [1, 2, 3, 4, 5]

时间复杂度: O(n) ~ O(n**2) 平均:O(n**2)

空间复杂度: O(1) 

算法实现: 

def bubble_sort(lists):
'''
:param lists:
:return lists:
'''

    for i in range(len(lists)-1):
        for j in range(len(lists)-i-1):
            if lists[j] > lists[j+1]:
                lists[j], lists[j+1] = lists[j+1], lists[j]
    return lists

# 调用冒泡排序
bubble_sort_list = bubble_sort(lis)
print(bubble_sort_list)

4、归并排序

归并排序(升序)【稳定排序】

原理:

利用分治法和递归法去解决问题。

  1. 第一步,划分字表;
  2. 第二步,合并半字表;

时间复杂度:O(nlogn)

空间复杂度:O(1) 

算法实现: 

def merge(left, right):
    i, j = 0, 0
    result = []
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def merge_sort(lists):
'''
:param lists:
:return lists:
'''
    if len(lists) <= 1:
        return lists
    num = len(lists) / 2
    left = merge_sort(lists[:num])
    right = merge_sort(lists[num:])
    return merge(left, right)

# 调用归并排序
merge_sort_list = merge_sort(lis)
print(merge_sort_list)

5、快速排序

快速排序(升序)【不稳定】

原理:

分治递归,给定一组序列,把序列分为两部分,前部分的所有元素比后部分的所有元素均有序为止。

分三步走:

  1. 分解,array[m,...,n] 划分成 array1[m,..,k] 和 array2[k+1,...,n],使array1[m,..,k]中任一元素的值不大于array2[k+1,...,n]中任一元素的值
  2. 递归求解,递归array1, array2;
  3. 合并,array[m,...,n] 自动排好序;

算法实现:  

def quick_sort(lists, left, right):
'''
:param lists:
:param left:
:param right:
:return lists:
'''
    if left >= right:
        return lists
    key = lists[left]
    low = left
    high = right
    while left < right:
        while left < right and lists[right] >= key:
            right -= 1
        lists[left] = lists[right]
        while left < right and lists[left] <= key:
            left += 1
        lists[right] = lists[left]
    lists[right] = key
    quick_sort(lists, low, left - 1)
    quick_sort(lists, left + 1, high)
    return lists

# 快速排序调用
quick_sort_list = quick_sort(lis, 0, len(lis) - 1)
print(quick_sort_list)

6、希尔排序

希尔排序(升序)【不稳定排序】。

原理:

也叫缩小增量排序,将待排序列分成多个子序列,每个子序列元素个数相对较少,对各个子序列分别进行直接插入排序,待整个排序序列"基本有序后",再对所有元素进行一次直接插入排序。

时间复杂度:O(nlogn) 最差 O(n**s)(1

空间复杂度:O(1) 

算法实现:  

def shell_sort(lists):
'''
:param lists:
:return lists:
'''
    count = len(lists)
    step = 2
    group = int(count / step)
    while group > 0:
        for i in range(0, group):
            j = i + group
            while j < count:
                k = j - group
                key = lists[j]
                while k >= 0:
                    if lists[k] > key:
                        lists[k + group] = lists[k]
                        lists[k] = key
                    k -= group
                j += group
        group /= step
    return lists

# 希尔排序调用
shell_sort_list = shell_sort(lis)
print(shell_sort_list)

7、堆排序

堆排序(升序)【不稳定排序】

原理:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

步骤:

  1. 构建堆;
  2. 交换堆顶元素和最后一个元素的位置;

时间复杂度:O(nlogn) 

算法实现:  

def adjust_heap(lists, i, size):
    lchild = 2 * i + 1
    rchild = 2 * i + 2
    maxs = i
    if i < size / 2:
        if lchild < size and lists[lchild] > lists[maxs]:
            maxs = lchild
        if rchild < size and lists[rchild] > lists[maxs]:
            maxs = rchild
        if maxs != i:
            lists[maxs], lists[i] = lists[i], lists[maxs]
            adjust_heap(lists, maxs, size)

def build_heap(lists, size):
    for i in range(0, (size / 2))[::-1]:
        adjust_heap(lists, i, size)


def heap_sort(lists):
'''
:param lists:
:return lists:
'''
    size = len(lists)
    build_heap(lists,size)
    for in range(0, )[::-1]:
        lists[0], lists[i] = lists[i], lists[0]
        adjust_heap(lists,0,i)


# 堆排序调用
heap_sort_list = heap_sort(lis)
print(heap_sort_list)

8、基数排序(桶排)

基数排序(桶排序)(升序)【稳定性排序】

基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

时间复杂度:O(nlog(r)m)  r是基数,m是堆数 

算法实现:  

import math

def radix_sort(lists, radix=10):
'''
:param lists:
:param radix:
:return lists:
'''

    k = int(math.ceil(math.log(max(lists),radix))
    bucket = [[] for i in range(radix)]
    for i in range(1,k+1):
        for j in lists:
            bucket[j/(radix**(i-1) % (radix**i)].append(j)
        del lists[:]
        for z in bucket:
            lists += z 
            del z[:]
    return lists

你可能感兴趣的:(C,C++,Python,Go,AI,算法工程师,语言处理,排序算法,算法)