冒泡排序BubbleSort
基本思想
通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻的元素值,
若发现逆序则交换,使值较大的元素逐渐从前往后移动,就像水底的气泡逐渐往上冒
优化
若一趟比较下来没有进行过交换,就说明序列有序,通过设置flag判断元素是否进行过交换,减少不必要的比较
过程
- 一共进行 数组大小-1 次的大循环
- 每一趟排序的次数逐渐减少
- 如果发现某趟排序中,没有发生一次交换,则提前结束排序
选择排序SelectSort
基本思想
每次假定需要排序数组第一位为最小值,找到需要排序数组中最小的值及其下标,将min与数组第一位进行交换。
即每次找到最小值放在数组最前面。总共进行n-1次
过程
- 选择排序一共有 数组大小-1 轮排序
- 每一轮排序,又是一个循环
- 假定当前这个数为最小值
- 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
- 当遍历到数组最后,就得到本轮最小数和下标
- 交换
插入排序InsertSort
基本思想
把n个待排序的元素看成一个有序和一个无序表,开始有序表只包含一个元素,无序表中包含n-1个元素,
排序过程中每次从无序表中取出第一个元素,把它的排序吗依次与有序表元素的排序码比较,
将它插入到有序表中的适当位置,使之成为新的有序表
希尔排序ShellSort
基本思想
把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,
每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止
快排排序QuickSort
基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分所有数据都要小,
然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程通过递归实现,依次达到整个数据变成有序序列
优化
- 基准选取可以优化为随机选取待排序的其中一个
- 分段可以优化为分成三段,一段比基准小,一段等于基准,一段大于基准,后续分别对小于和大于基准的进行快排即可
归并排序MergeSort
基本思想
利用归并的思想实现的排序方法,该算法采用经典的分治策略,分治法将问题分成一些小问题然后递归求解,
而治的阶段则将分的阶段得到的各答案修补在一起,即分而治之
堆排序HeapSort
基本思想
- 将待排序序列构造成一个大顶堆
- 此时整个序列的最大值就是堆顶的根节点
- 将其与末尾元素进行交换,此时末尾就为最大值
- 然后将剩余n-1个元素重新构造成一个堆,就会得到n个元素的次小值。反复执行,即可得到一个有序序列
特点
- 利用数组模拟完全二叉树
- 父节点 i 的两个 子节点位置为2i+1与2i+2
基数排序RadixSort
基本思想
- 将所有待比较数值同一为同样的数为长度,数位较短的数前面补零。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序数列
- 基数排序属于分配式排序,又称桶子法bucket sort或bin sort,顾名思义,通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用
- 基数排序法属于稳定排序,是效率高的稳定排序法
- 是桶排序的扩展
- 将整数按位数切割成不同的数字,然后按每个位数分别比较
代码
import java.util.Arrays;
/**
* @author ZhangXiong
* @version v12.0.1
* @date 2020-07-17
*/
public class Sort {
public static void main(String[] args) {
int n = 8000000;
int[] arr = new int[n];
int[] arr1 = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = (int) (Math.random() * n);
arr1[i] = arr[i];
}
long start = System.currentTimeMillis();
// 测试sort
new Sort().heapSort(arr);
long mid = System.currentTimeMillis();
System.out.println("mySort cost: " + (mid - start) + "ms");
Arrays.sort(arr1);
long end = System.currentTimeMillis();
// 打印排序后的数组
//System.out.println(Arrays.toString(arr));
System.out.println("ArraysSort cost: " + (end - mid) + "ms");
System.out.println(Arrays.equals(arr, arr1));
}
/**
* 冒泡排序
* 稳定排序
*
* @param arr
*/
public void bubbleSort(int[] arr) {
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 1; j <= i;