冒泡排序 BubbleSort
基本思想
基本思想:每次比较两个相邻的元素,如果它们的顺序不对,就交换。
实现
从小到大排序:3, 1, 5, 7, 2, 4, 9, 6
代码:
1 | # coding:utf-8 |
优化
注意到经过一次排序,数组就已经是有序的了。可以针对上述代码进行优化:
优化1:某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了。用一个标记记录这个状态即可。
1 | def bubbleSort_2(numbers): |
优化2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序,不用再排序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。
1 | def bubbleSort_3(numbers): |
选择排序 SelectionSort
基本思想
- 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 以此类推,直到所有元素均排序完毕。
实现
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
1 | def selectSort(numbers): |
插入排序 InsertionSort
基本思想
基本思想:对于每个未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
步骤:
- 认为第0个元素有序
- 从第1个元素开始,取出当前元素now,和有序的数组从后往前对比
- 如果now大于等于有序数组最后一个元素,则continue;否则,将有序数组元素逐个后移,找到元素now应该插入的位置,插入now
实现
从小到大排序:3, 1, 5, 7, 2, 4, 9, 6
代码:
1 | def insertionSort(numbers): |
快速排序 QuickSort
基本思想
采用分治思想
实现
从小到大排序:3, 1, 5, 7, 2, 4, 9, 6
代码:
1 | def quickSort(numbers, start, end): |
归并排序 MergeSort
基本思想
采用分治思想
实现
从小到大排序:3, 1, 5, 7, 2, 4, 9, 6
代码:
1 | def merge_sort(ary): |
堆排序 HeapSort
基本思想
堆排序在 top K 问题中使用比较频繁。堆排序是采用二叉堆的数据结构来实现的,虽然实质上还是一维数组。二叉堆是一个近似完全二叉树 。
实现
从小到大排序:3, 1, 5, 7, 2, 4, 9, 6
代码:
1 | def heap_sort(ary): |