排序原理和实现
排序是每个软件工程师和开发人员都需要掌握的技能。不仅需要通过编程面试,还要对程序本身有一个全面的理解。不同的排序算法很好地展示了算法设计上如何强烈的影响程序的复杂度、运行速度和效率。
排序有很多种实现方法,比如冒泡排序、选择排序、归并排序、希尔排序、快速排序、插入排序、堆排序、基数排序等,今天就给大家介绍使用Python语言实现的其中4个排序算法。
1. 快速排序
首先要打乱序列顺序 ,以防算法陷入最坏时间复杂度。快速排序使用“分而治之”的方法。
对于一串序列,首先从中选取一个数,凡是小于这个数的值就被放在左边一摞,凡是大于这个数的值就被放在右边一摞。然后,继续对左右两摞进行快速排序。
直到进行快速排序的序列长度小于 2 (即序列中只有一个值或者空值)。
def quicksort(seq): if seq == []: return [] else: one = seq[0] two = quicksort([l for l in seq[1:] if l < one]) three = quicksort([m for m in seq[1:] if m >= one]) return two + [one] + three paixu = quicksort([11,23,6,3,9,22,5,28,27,19]) print('快排:',paixu) # 快排: [3, 5, 6, 9, 11, 19, 22, 23, 27, 28]
2. 冒泡排序
冒泡排序(顺序形式),从左向右,两两比较,如果左边元素大于右边,就交换两个元素的位置。
其中,每一轮排序,序列中最大的元素浮动到最右面。也就是说,每一轮排序,至少确保有一个元素在正确的位置。
这样接下来的循环,就不需要考虑已经排好序的元素了,每次内层循环次数都会减一。
其中,如果有一轮循环之后,次序并没有交换,这时我们就可以停止循环,得到我们想要的有序序列了。
def bouble_sort(seq): count = len(seq) for i in range(0,count): for j in range(i + 1,count): if seq[i] > seq[j]: seq[i],seq[j] = seq[j],seq[i] return seq paixu = bouble_sort([11,25,26,13,39,23,15,28,37,12,48]) print('冒泡排序:',paixu) # 冒泡排序: [11, 12, 13, 15, 23, 25, 26, 28, 37, 39, 48]
3. 选择排序
选择排序,每次选择当前序列的最小值,将其与当前序列的第一个元素交换位置,每迭代一次,当前序列长度减一。迭代结束,即可得到有序序列。
def select_sort(seq): for i in range(len(seq)-1): x=i for j in range(i,len(seq)): if seq[j] < seq[x]: x=j seq[i],seq[x] = seq[x],seq[i] return seq paixu = select_sort([11,25,6,13,9,23,15,28,27,19,18]) print('选择排序:',paixu) # 选择排序: [6, 9, 11, 13, 15, 18, 19, 23, 25, 27, 28]
4.插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
def insert_sort(list): for i in range(len(list)): for j in range(i): if list[i]<list[j]: list.insert(j,list.pop(i)) break return list list = insert_sort([1,3,5,7,9,6,8,2,4]) print('插入排序:',list) # 插入排序: [1, 2, 3, 4, 5, 6, 7, 8, 9]
以上,就是我们今天所讲的4种Python排序方法,不知道你学会了吗?快动手练习练习吧~