排序算法基本思想及实现

一、插入排序

1、直接插入排序

    基本思想:类似抓扑克牌,待排序元素在已排序的序列中从后往前遍历,遇到大于他的元素向后移一位,直至遇到小于或等于他的元素,在其后插入即可

def insert_sort(lst: List):
"""
插入排序
:param lst:待排序序列
:return:已排序序列
"""
n = len(lst)
for i in range(1, n):
# 从后向前扫描
for j in range(i, 0, -1):
if lst[j - 1] > lst[j]:
lst[j - 1], lst[j] = lst[j], lst[j - 1]

return lst

2、希尔排序(是对直接插入排序的一种改进, 也叫什么缩小增量排序,了解了一番,还不是很明白)

二、交换排序

  1、冒泡排序

    基本思想:相邻的两个元素进行两两比较,如果出现逆序,则小的元素向前移动

    代码实现:  

 1 def bubble_sort(lst):
 2     """冒泡排序"""
 3     n = len(lst)
 4     for i in range(n):
 5         for j in range(1, n-i):
 6             if not lst[j-1] > lst[j]:
 7                 # print("{}小于{},无需替换".format(lst[j-1], lst[j]))
 8                 continue
 9             lst[j-1], lst[j] = lst[j], lst[j-1]
10 
11     return lst

  2、快速排序(是对冒泡排序的一种改进)

    基本思想:找到一个基准元素,比其小的元素放置左边,反之不小于他的元素放置右边,由此分成左右两个区间,对左右两个区间进行递归,重复以上操作,最终形成有序序列

    代码实现:

1 def quick_sort(lst):
2     """快速排序"""
3     n = len(lst)
4     if n <= 1:
5         return lst
6     baseline = lst[0]
7     left = [lst[i] for i in range(1, n) if lst[i] < baseline]
8     right = [lst[i] for i in range(1, n) if lst[i] >= baseline]
9     return quick_sort(left) + [baseline] + quick_sort(right)

三、选择排序

  1、直接选择排序

    基本思想:从待排序记录中找到最小或最大的元素,放置起始位置,然后再从剩下的序列中找到最值,放置在已排序的序列末尾,直至待排序记录为空

    代码实现:

1 def select_sort(lst):
2     """直接选择排序"""
3     for i in range(len(lst)):
4         res = min(lst)
5         yield res
6         lst.remove(res)

  2、堆排序

    基本思想:堆是python中一种基本的数据结构,heapq[0]永远是序列中最小的元素

    代码实现:

1 def select_sort(lst):
2     """堆排序"""
3     heapq.heapify(lst)
4     for i in range(len(lst)):
5         yield heapq.heappop(lst)

四、归并排序

  1、二路归并排序

    基本思想:先拆再合:带有N个元素的待排序序列分成N个子序列 ,相邻的序列进行两两合并,在合并的过程中,较小的元素放置左边,较大的元素放置右边

以上总结仅代表个人理解,可能存在不足,还请批评指正,后面的话还会继续完善

posted on 2022-09-21 16:43  默玖  阅读(49)  评论(0编辑  收藏  举报

导航