博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 排序算法总结:选择排序,冒泡算法,归并排序(后续补充其他算法)
阅读量:3775 次
发布时间:2019-05-22

本文共 2691 字,大约阅读时间需要 8 分钟。

python 排序算法总结

写代码的终极原则:高内聚,低耦合(high cohesion, low coupling)。

函数应该做到无副作用(调用函数后不影响原来的参数)

在这里插入代码片

一,简单排序算法(低级排序算法) —> O(N**2)

1. 简单选择排序 - 每次从剩下的元素中选择最小元素(或最大元素)放到排好序的列表中

def select_sort(items, *, cmp=lambda x1, x2: x1 > x2):    items = items[:]    n = len(items)    for i in range(n):        point = i  # point指向最小值        for j in range(i+1, n):            if cmp(items[point], items[j]):                point = j        if point != i:            items[i], items[point] = items[point], items[i]    return itemsnums3=[1,4,23,67,3,66,69,13]print('排序前:nums3', nums3) # 排序前:nums3 [1, 4, 23, 67, 3, 66, 69, 13]print('排序结果:', select_sort(nums3)) # 排序结果: [1, 3, 4, 13, 23, 66, 67, 69]print('排序后:nums3', nums3) # 排序后:nums3 [1, 4, 23, 67, 3, 66, 69, 13]

2. 简单插入排序 - 一次取元素,但是要将当前元素插入到合适的位置以确保顺序

3. 冒泡排序 - 两两比较,前面大于后面(或者前面小于后面)就交换位置

冒泡排序:通过不管是升序还是降序,每一次从开始遍历都需要两两比较,把这一轮遍历最大或者最小的值放在最后(冒泡)。下一轮遍历开始前时需要遍历的长度减1。

# 函数应该做到无副作用(调用函数后不影响原来的参数)def bubble_sort(items, *, cmp=lambda x, y: x > y):    items = items[:]# 相当于深拷贝    n = len(items)    for i in range(n - 1):        swapped = False        for j in range(n - 1 - i):            if cmp(items[j], items[j + 1]):                items[j], items[j + 1] = items[j + 1], items[j]                swapped = True        if not swapped:            break    return items                nums = np.random.randint(1, 100, 8).tolist()print('排序前nums:', nums) # 排序前nums: [23, 81, 69, 46, 36, 11, 10, 16]print('排序结果:', bubble_sort(nums)) # 排序结果: [10, 11, 16, 23, 36, 46, 69, 81]print('排序后nums:',nums) # 排序后nums: [23, 81, 69, 46, 36, 11, 10, 16]

二,高级排序算法 —> O(N * logN)

1. 快速排序 - 选择枢轴对数据进行划分

2. 归并排序 - 先把列表一分为二,二分为四,拆分到只有一个元素,然后把有序列表两两有序合并

def merge(items1, items2):    """将两个有序的列表合并成一个新的有序列表"""    items3 = []    idx1, idx2 = 0, 0    while idx1 < len(items1) and idx2 < len(items2):        a, b = items1[idx1], items2[idx2]        if a <= b:            items3.append(a)            idx1 += 1        else:            items3.append(b)            idx2 += 1    items3 += items1[idx1:]    items3 += items2[idx2:]    return items3# nums1 = [12, 35, 41, 58, 67, 99]# nums2 = [10, 11, 20, 30, 40, 50]# merge(nums1, nums2) # [10, 11, 12, 20, 30, 35, 40, 41, 50, 58, 67, 99]def merge_sort(items):    """归并排序"""    if len(items) <= 1:        return items[:]    mid = len(items) // 2    left, right = items[:mid], items[mid:]    return merge(merge_sort(left), merge_sort(right))nums3 = [1,4,23,67,3,66,69,13]print('排序前:nums1', nums3)print('排序结果:', merge_sort(nums3))print('排序后:nums1', nums3)# 排序前:nums1 [1, 4, 23, 67, 3, 66, 69, 13]# 排序结果: [1, 3, 4, 13, 23, 66, 67, 69]# 排序后:nums1 [1, 4, 23, 67, 3, 66, 69, 13]

3. 堆排序 - 建立一个堆结构(树,层次结构),按层次组织元素

Python内置的sorted使用的是???—> TimSort(多核版的归并排序)

转载地址:http://skbvn.baihongyu.com/

你可能感兴趣的文章
运行未安装VS2005的机器上C++程序
查看>>
DLL的显示链接
查看>>
在c++->code generation中的Runtime Library有以下几种选项
查看>>
一个简单的显示驱动
查看>>
MFC程序逆向-消息篇
查看>>
通用 Thunk
查看>>
Serial Communications in Win32
查看>>
VS2008 sp1 菜单和工具栏修改了而显示却没有改变的解决方法
查看>>
STM32固件库详解
查看>>
IMediaEventEx 转帖
查看>>
Gamma校正
查看>>
Dll分配的内存块,应用释放的问题
查看>>
STM32 USB Mass Storage 例程调试笔记
查看>>
USB启动过程
查看>>
CFileDialog改变文件路径导致的一系列问题(如无法安全删除u盘、访问相对路径失败)的解决方法
查看>>
STM32的GPIO口的8种配置模式
查看>>
BMP位图与调色板分析
查看>>
html向swf传递参数的方法
查看>>
MFC多线程编程注意事项
查看>>
使用可重入函数进行更安全的信号处理
查看>>