插入排序(包含希尔排序)
插入排序
思想:
1. 将数组元素分为两组,一组有序(初始化为第一个元素为第一组),一组无序(后面的元素为第二组)。
2. 在排序时,将第二组的元素插入插入到第一组中,并按照排序规则,找到其相应的位置插入。
代码实现:
import java.util.Arrays;
public class InsertSort {
public void SortByInsertByTest(int[] arr) {
for (int n = 0; n < arr.length - 1; n++) {
int insertValue=arr[n+1];
int insertIndex=n;
/*
1.insertIndex>=0保证数组下标不会越界
2.insertValue<arr[insertIndex]保证此时待插入数组还没有找到合适位置
3.arr[insertIndex+1]=arr[insertIndex];将有序的数组后移
4. insertIndex--;继续向前寻找位置。
5.当退出while循环时,说明已经找到合适的位置,插入即可。
*/
while (insertIndex >= 0 && insertValue<arr[insertIndex]) {
arr[insertIndex+1]=arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1]=insertValue;
System.out.println("第"+n+"排序后的结果为:"+Arrays.toString(arr));
}
}
}
希尔排序
思想:
将待排序的数组按照length/2分组,采用缩小增量法进行排序。
代码实现(交换法):
数组:
int[] arr = {8,9,1,7,2,3,5,4,6,0};
逐步推导:
//使用逐步推倒的方法
public static void sortByShellTest(int[] arr) {
int temp=0;
//希尔排序的第一轮排序
//因为第一轮排序是将10个数据分成5组
for (int i = 5; i <arr.length ; i++) {
//遍历各组中的所有的元素(共5组,每组有两个元素),步长为5
for (int j = i-5; j >=0 ; j-=5) {
if (arr[j] > arr[j + 5]) {
temp = arr[j];
arr[j] = arr[j + 5];
arr[j+5]=temp;
}
}
}
System.out.println("希尔排序第一轮后的结果为:"+ Arrays.toString(arr));
//希尔排序第二轮排序
//应为第二轮排序是将10个数据分成5/2组
for (int i = 2; i < arr.length; i++) {
for (int j=i-2;j>=0;j=j-2){
if (arr[j] > arr[j + 2]) {
temp = arr[j];
arr[j] = arr[j + 2];
arr[j+2]=temp;
}
}
}
System.out.println("希尔排序第二轮后的结果为:"+ Arrays.toString(arr));
//希尔排序第三轮排序
//应为第二轮排序是将10个数据分成5/2/2组
for (int i = 1; i < arr.length; i++) {
for (int j=i-1;j>=0;j=j-1){
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j+1]=temp;
}
}
}
System.out.println("希尔排序第三轮后的结果为:"+ Arrays.toString(arr));
}
归纳:
public static void shellSort(int[] arr){
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
int temp=0;
for (int i = gap; i <arr.length ; i++) {
for (int j = i-gap; j >=0 ; j-=gap) {
if (arr[j] > arr[j + gap]) {
temp = arr[j];
arr[j] = arr[j + gap];
arr[j+gap]=temp;
}
}
}
}
System.out.println("希尔排序后的结果是:"+Arrays.toString(arr));
}
代码优化(移动法):
//对交换式的希尔排序进行优化->移位发
public static void shellSort2(int[] arr){
//增量gap,并逐步缩小增量
for (int gap = arr.length/2; gap >0 ; gap/=2) {
//从第gap个元素开始,逐个对其所在的组进行直接插入排序
for (int i = gap; i < arr.length; i++) {
int insertValue=arr[i];
int insertIndex=i-gap;
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + gap] = arr[insertIndex];
insertIndex-=gap;
}
arr[insertIndex+gap]=insertValue;
}
}
System.out.println(Arrays.toString(arr));
}

浙公网安备 33010602011771号