插入排序
插入排序是最简单的排序算法之一。插入排序由N-1次排序组成。每一次插入,都保证数组为已排序状态。
时间复杂度:O(n2)。
实现:
1 | /** |
希尔排序
希尔排序又叫做缩减增量排序,是对插入排序的一种优化算法。它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而缩小,直到只比较相邻元素的最后一趟排序位置。
实现:
1 | private static int[] shellSort(int[] array) { |
堆排序
堆排序是基于二叉堆实现的排序算法。其实现思路:
- 将无序数组中的元素逐个插入二叉堆;
- 将根节点R从二叉堆中移除到排序的数组,将二叉堆中最后的节点X放置根节点
- 对X进行下滤,直到二叉堆满足特性之后,重复2操作
当算法终止时,数组则以排好的顺序包含所有元素。
关于二叉堆,请看文章:二叉堆。
归并排序
归并排序采用递归分治的方式来实现排序。
- 将原数组分为左、右两个数组;
- 分别对左、右两个数组进行排序;
- 将排序完毕的左、右数组,根据排序规则合并成一个数组。
实现:
1 | /** |
快速排序
原理
从一组未排序的元素中,随机选取一个元素,作为枢纽元。然后让剩余的元素与枢纽元进行比较,将集合分为三部分:小于枢纽元的组成一部分,大于枢纽元的组成一部分,最后是枢纽元单独成为一部分。然后在递归的对小集合和大集合再重复此操作,最终完成排序。
实现
- 选取枢纽元;
- 随机选取;
- 三数中值选取,取首、尾和中心的三个元素的中值;
- 将枢纽元与数组的最后一个元素交换位置;
- 创建两个指针,指针i指向第一个元素,指针j指向倒数第二个元素;
- 当i在j的左侧时,将i向右移,移过那些小于枢纽元的元素,停留在大于枢纽元的元素上;同时将j向左移,移过那些大于枢纽元的元素,停留在小于枢纽元的元素上;然后将i上的元素与j上的元素互换位置;
- 当i与j重合或i在j的右侧时,停止两个指针的移动,并将枢纽元与指针i指向的元素交换位置。
实现:
1 | public void queckSort(int[] array, int left, int right) { |