python实现四种排序逻辑与代码
参考链接:https://blog.csdn.net/u010786109/article/details/41911401
1、冒泡排序
原理:对一组数据,比较相邻数据的大小,将值小数据放在前面,值大的数据放在后面。
比较结论:对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。
实现代码:
2、快速排序
原理:
步骤
- 获得待排序数组a
- 选取一个合适的数字p(一般来说就选取数组或是子数组的第一个元素)作为排序基准
- 将待排序数组a中比基准p小的放在p的左边,比基准p大的放在p的右边
- 从第3步获得的两个子数组sub1跟sub2
- 判断sub1或sub2中是否只有一个元素,如果只有一个元素则返回此元素,否则就将sub1(或是sub2)代回到第1步中继续执行
- 具体过程可以参见下面的过程
实现代码:
# coding:utf-8 # 冒泡排序实现 def bubbleSort(data): if len(data) < 2: return data else: for i in range(0, len(data) - 1): m = i for j in range(i + 1, len(data)): if data[m] > data[j]: m = j if m != i: # 不使用中间元素,下面语句直接完成两个数组元素交换 data[i], data[m] = data[m], data[i] return data # 插入排序实现 def insertSort(data): if len(data) < 2: return data for i in range(1, len(data)): key = data[i] j = i - 1 while j >= 0 and key < data[j]: data[j + 1] = data[j] j = j - 1 data[j + 1] = key return data # 快速排序实现 def partition(data, p, r): i = p - 1 cmp = data[r] for j in range(p, r): if data[j] < cmp: i = i + 1 if i <> j: data[i], data[j] = data[j], data[i] if (i + 1) <> r: data[i + 1], data[r] = data[r], data[i + 1] return i + 1 def randomPartition(data, p, r): import random i = random.randint(p, r) data[i], data[r] = data[r], data[i] return partition(data, p, r) def quickSort(data, p, r): if p < r: # q = partition(data, p, r) q = randomPartition(data, p, r) quickSort(data, p, q - 1) quickSort(data, q + 1, r) # 归并排序 from heapq import merge def merge_sort(m): if len(m) <= 1: return m middle = len(m) / 2 left = m[:middle] right = m[middle:] left = merge_sort(left) right = merge_sort(right) return list(merge(left, right) # 创建一个100个元素的数组,每次用shuffle打乱之后再排序 from random import shuffle, sample numbers = sample(range(10), 9) shuffle(numbers) print numbers print 'after sorted:' insertSort(numbers) print numbers #冒泡排序 shuffle(numbers) print numbers print 'after sorted:' bubbleSort(numbers) print numbers shuffle(numbers) print numbers print 'after sorted:' quickSort(numbers, 0, len(numbers) - 1) print numbers shuffle(numbers) print numbers print 'after sorted:' numbers = merge_sort(numbers) print numbers