选择排序
- 找到最小的元素,将其与数组中第一个元素交换
插入排序
- 很适用于非随机数组
- 将每个元素插入到一个已经排序的数组
- 插入的元素之后的所有元素位置往后挪一位
希尔排序
- 解决插入排序中每次比较的都是相邻的问题
- 先使数组中任意间隔为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, 满足