Java实现七大排序算法篇
1.插入排序
1.1 直接插入排序
直接插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
- 原理
整个区间被分为
- 有序区间
- 无序区间
每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入
- 动图演示
- 代码演示
import java.util.Arrays;
import java.util.Random;
/**
* ClassName: InsertSort
* Description: 直接插入排序
* date: 2021/5/13 13:24
* 时间复杂度:
* 最好情况下:当数据有序的时候,O(n) -》 当数据越有序越快
* 最坏情况下:当数据逆序的时候,可以达到O(n^2)
* 空间复杂度:O(1)
* 稳定性:稳定
* 任何一个稳定的排序 一定可以变成不稳定的排序
* 但是如果本身就是不稳定的排序 不可能变成稳定的排序的
*/
public class InsertSort {
public static void insertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
// 有序区间: [0, i)
// 无序区间: [i, array.length)
int tmp = array[i]; // 无序区间的第一个数
int j = i-1;
for (; j >= 0; j--) {
if (array[j] > tmp) {
array[j+1] = array[j];
} else {
//array[j+1] = tmp;
break;//遇到break说名j下标的元素已经小于了tmp,于是将tmp放入j+1的下标,后面的循环就没必要进行了
}
}
array[j+1] = tmp;
}
}
//测试
public static void main(String[] args) {
Random random = new Random();
int[] array = new int[10];
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(10);
}
System.out.println(Arrays.toString(array));
insertSort(array);
System.out.println(Arrays.toString(array));
}
}
1.2 希尔排序
希尔排序,也称递减增量排序算法,是直接插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
- 动图演示
- 代码演示
import java.util.Arrays;
import java.util.Random;
/**
* ClassName: ShellSort
* Description: 希尔排序
* 时间复杂度:建议:-> O(n^1.3 - 1.5)
* 空间复杂度:O(1)
* 稳定性:不稳定
*/
public class ShellSort {
private static void shellSort(int[] array) {
int[] arr = {
5,3,1};
for (int i = 0 ;i <arr.length; i++) {
shell(array, arr[i]);
}
//这样做一般不太好,不一定能得出len都是素数,更不能保证len最后会为1
// int len = array.length;
// while (len>1) {
// shell(array, len);
// len = (len/3) +1;
// }
//运行这个相当于直接插入排序了
shell(array, 1);
}
private static void shell(int[] array, int k) {
for (int i = k; i <array.length ; i++) {
int tmp = array[i];
int j = i-k;
for (