插入排序典型的两种排序算法:直接插入排序、希尔排序。
1.直接插入排序:经一个数据插入到一个已经排好序的有序表中,得到一个新的有序表,新的有序表长度+1.
要注意的是:每一轮排序的过程中需要建立一个哨兵来记录中间变量以及确定数组边界。
public int[] insertSort(int[] arr){
if(arr.length == 0){
return null;
}
if(arr.length == 1){
return arr;
}
for(int i=1; i<arr.length; i++){
if(arr[i] < arr[i-1]){
int j = i-1;
int s = arr[i];//哨兵
arr[i] = arr[i-1];
while(j>=0 && s < arr[j]){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = s;
}
}
return arr;
}
2.希尔排序:将整个序列分成若干个子序列,对每个子序列分别进行直接插入排序,待序列基本有序时再对整个序列进行直接插入排序。
public void shellInsertSort(int[] arr,int d){
if(arr.length == 0){
System.out.println("序列为空,无法进行排序!");
}
if(arr.length == 1){}
for(int i=d; i<arr.length; i++){
if(arr[i] < arr[i-d]){
int j = i-d;
int s = arr[i];//哨兵
arr[i] = arr[i-d];
while(j>=0 && s<arr[j]){
arr[j+d] = arr[j];
j = j-d;
}
arr[j+d] = s;
}
}
}
public int[] shellSort(int[] arr){
int d = arr.length / 2;
while(d >= 1){
shellInsertSort(arr,d);
d = d/2;
}
return arr;
}
来简单测试一下:
//打印数组
public void printArr(int[] arr){
for(int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args){
SortTest sort = new SortTest();
int[] arr = {23,66,3,7,15,25,57,10};
sort.printArr(arr);
System.out.println();
/*int[] insertSortArr = sort.insertSort(arr);
sort.printArr(insertSortArr);*/
int[] shellArr = sort.shellSort(arr);
sort.printArr(shellArr);
}