选择排序
- 找到最小的元素,将其与数组中第一个元素交换
插入排序
- 很适用于非随机数组
- 将每个元素插入到一个已经排序的数组
- 插入的元素之后的所有元素位置往后挪一位
希尔排序
- 解决插入排序中每次比较的都是相邻的问题
- 先使数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组
- 对于每个h,用插入排序将h个子数组独立地排序
- 逐渐减小h,直到h = 1
- 实现方法
- 把插入排序改造为间隔为 h 的插入排序
- 用一个 for 循环不断调整 h
归并排序
- 分治思想
- 把数组二分,左边和右边分别排序,然后合并
mergeSort()
->sort(left)
andsort(right)
andmerge(left,right)
- 另一种思路是自底而上的思想,先两两合并小数组,依次增加(比如先合并1元素的数组,再合并2,再合并4...)
sort(left)
这种输入参数需要包括 lo 和 himerge
需要包括 lo、mid、hi, 实现过程中要开个全局变量辅助数组 aux(因为每次都开新数组空间利用很大),aux 与原来的a[lo..hi]
相同,实现 merge 函数时,要给 aux 定义两个 index 变量 i,j。 利用 aux 辅助数组来替换 a 数组中的值
快速排序
- 分区,比它小的放左边
a[lo..lt-1]
,等于它的放中间a[lt..gt]
,比它大的放右边a[gt+1..hi]
sort()
-> 采用三向切分,遍历 a,用 i 来遍历 a,直到达到 gt`- 对于每次的 i, 满足
a[lo..lt - 1] < val
,a[gt+1..hi] >val
,a[lt..i-1] == val
,a[i..gt]
未知 a[i] < v -> a[lt]
(a[lt]
一直等于val) 与a[i]
交换,lt 和 i 加 1a[i] > v -> a[gt]
(a[gt]
一直是未知) 与a[i]
交换,gt - 1 (但 i 不变,因为每次锁定的是a[lo..lt - 1]
,a[gt + 1..hi]
,a[lt..i-1]
的变量)a[i] = v
->i + 1
- 对于每次的 i, 满足