插入排序
什么是插入排序
插入排序(Insertion sort),也被称为直接插入排序。
对少量的元素进行排序,效果很显著。
生活中,玩扑克牌就是利用了插入排序。拿到一张牌后,插入到手里的有序排列中,直到将牌拿完并排序结束
数组也是一样,要排序的元素按照大小依次插入到已经排好的有序数组中,直到排完为止
原理
插入排序的基本思想是将待排序的数组分成两部分,已排序的和未排序的。
每次从未排序的部分中取出第一个元素,将它插入到已排序的部分中的合适位置。插入时,从已排序的部分的最后一个元素开始比较,如果比它大,则将它后移一位,直到找到合适的位置。具体实现是通过嵌套两个循环,外层循环控制待排序的元素,内层循环控制已排序的元素。在内层循环中,如果当前元素比前一个元素小,则将前一个元素后移一位,直到找到合适的位置,然后将当前元素插入到该位置。
升序插入排列
@Test
public void testInsertAscengSort() {
int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
int aLength = a.length;
System.out.println("排序前"+Arrays.toString(a));
//第一轮排序
for (int i = 1; i < aLength; i++) {
//将当前元素赋值给变量
int insertData = a[i];
while (i > 0) {
//两个相邻的元素做比较
if (a[i - 1] > insertData) {
//将大的值往后一个位置移
a[i] = a[i - 1];
} else if (a[i - 1] < insertData) { // 如果小于insertData,插入位置
a[i] = insertData;
break;
}
/**
* 索引递减
* while循环反复进行元素比较
*/
i--;
}
//如果是第一个位置就将其插入
if (i == 0) {
a[0] = insertData;
}
}
System.out.println(Arrays.toString(a));
}
测试结果
方式2
@Test
public void test() {
int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
// 从第二个元素开始,依次将买个元素插入到前面已排序的序列中
for (int i = 1; i < a.length; i++) {
int j = i;
int temp = a[j];
//while循环检测当前元素temp是否小于其左侧的元素a[j - 1]
while (j > 0 && a[j - 1] > temp){
//调换位置
a[j] = a[j - 1];
/**
* 用于每次while循环迭代后将j的值减1(必须)
* 因为while循环用于向右侧移动元素,直到找到当前元素的正确位置,通过减小j,
* 确保当前元素被插入到已排序的字数组中的正确位置
*/
j--;
}
a[j] = temp;
}
System.out.println(Arrays.toString(a));
}
降序插入排序
@Test
public void testInsertAscengSort() {
int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
int aLength = a.length;
System.out.println("排序前"+Arrays.toString(a));
//第一轮排序
for (int i = 1; i < aLength; i++) {
//将当前元素赋值给变量
int insertData = a[i];
while (i > 0) {
//两个相邻的元素做比较
if (a[i - 1] < insertData) {
//将小的值往后一个位置移
a[i] = a[i - 1];
} else if (a[i - 1] > insertData) { // 如果大于insertData,插入位置
a[i] = insertData;
break;
}
/**
* 索引递减
* while循环反复进行元素比较
*/
i--;
}
//如果是第一个位置就将其插入
if (i == 0) {
a[0] = insertData;
}
}
System.out.println("排序后"+Arrays.toString(a));
}
测试结果
插入排序工具类
package com.sin.demo.utli;
/**
* @author sin
* @date 2022/11/1
* @apiNote
*/
public class InsertSortUtils {
/**
* 升序排序
*
* @param array
* @return
*/
public byte[] ascengSort(byte[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
byte insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 升序排序
*
* @param array
* @return
*/
public short[] ascengSort(short[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
short insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 升序排序
*
* @param array
* @return
*/
public int[] ascengSort(int[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
int insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 升序排序
*
* @param array
* @return
*/
public long[] ascengSort(long[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
long insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 升序排序
*
* @param array
* @return
*/
public float[] ascengSort(float[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
float insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 升序排序
*
* @param array
* @return
*/
public double[] ascengSort(double[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
double insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 升序排序
*
* @param array
* @return
*/
public char[] ascengSort(char[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
char insertData = array[i];
while (i > 0) {
if (array[i - 1] > insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] < insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public byte[] dropSort(byte[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
byte insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public short[] dropSort(short[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
short insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public int[] dropSort(int[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
int insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public long[] dropSort(long[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
long insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public float[] dropSort(float[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
float insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public double[] dropSort(double[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
double insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
/**
* 降序排序
*
* @param array
* @return
*/
public char[] dropSort(char[] array) {
int arrayLength = array.length;
for (int i = 1; i < arrayLength; i++) {
char insertData = array[i];
while (i > 0) {
if (array[i - 1] < insertData) {
array[i] = array[i - 1];
} else if (array[i - 1] > insertData) {
array[i] = insertData;
break;
}
i--;
}
if (i == 0) {
array[0] = insertData;
}
}
return array;
}
}
//实例化
InsertSortUtils insertSort = new InsertSortUtils();
int类型升序测试
@Test
public void testInsertSort() {
int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
System.out.println("排序前" + Arrays.toString(a));
insertSort.ascengSort(a);
System.out.println("排序后" + Arrays.toString(a));
}
测试结果
int类型降序测试
@Test
public void testInsertSort() {
int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
System.out.println("排序前" + Arrays.toString(a));
insertSort.dropSort(a);
System.out.println("排序后" + Arrays.toString(a));
}
测试结果
char类型升序测试
@Test
public void testInsertSort() {
char[] a = {'a','c','b','v','z','e','d'};
System.out.println("排序前" + Arrays.toString(a));
insertSort.ascengSort(a);
System.out.println("排序后" + Arrays.toString(a));
}
测试结果
char类型降序测试
@Test
public void testInsertSort() {
char[] a = {'a','c','b','v','z','e','d'};
System.out.println("排序前" + Arrays.toString(a));
insertSort.dropSort(a);
System.out.println("排序后" + Arrays.toString(a));
}