package application;
public class Study {
public static void main(String[] args) {
//从小到大
int[] a = {0,2,4,3,9,6,10,7,1,8,5};
int[] b = sort2(a);
System.out.print("排序结果:\n");
for(int i = 0;i < b.length;i++){
System.out.print(b[i] + " ");
}
}
//直接插入排序
private static int[] sort1(int[] a){
//第一个之外的排序
//a[0]是哨兵,临时存储待插入值,a[1]至a[n]排序
System.out.print("排序开始------(第一个是哨兵):\n");
for(int i = 2;i <= a.length - 1;i++){
if(a[i - 1] > a[i]){//需插入的满足条件,前一个大于后一个
a[0] = a[i];//存储哨兵
a[i] = a[i - 1];//将前面的后移
int j;
for(j = i - 2;a[j] > a[0];j--){//继续向前比较,看是否需将前面的后移
a[j + 1] = a[j];
}
//a[j]没有哨兵a[0]大,可以将带插入值插入了
a[j + 1] = a[0];
}
for(int m = 0;m < a.length;m++){
System.out.print(a[m] + " ");
}
System.out.print("\n");
}
System.out.print("排序结束------(第一个是最后一个哨兵):\n");
return a;
}
//折半插入排序
private static int[] sort2(int[] a){
//第一个之外的排序
//a[0]是哨兵,临时存储待插入值,a[1]至a[n]排序
System.out.print("排序开始------(第一个是哨兵):\n");
for(int i = 2;i <= a.length - 1;i++){
if(a[i - 1] > a[i]){//需插入的满足条件,前一个大于后一个
a[0] = a[i];//存储哨兵
a[i] = a[i - 1];//将前面的后移
int low = 1,high = i - 1;//将a[i]在a[1]至a[i - 1]通过折半查找方式插入
int mid;
while(low <= high){
mid = (low + high)/2;//向下取整
if(a[mid] > a[0]){//a[i]应该在a[low]至a[mid - 1]之间插入
high = mid - 1;
}else{
low = mid + 1;//a[i]应该在a[mid + 1]至a[high]之间插入
}
}
//此时low > high
//high + 1是待插入值应插入的位置
for(int j = i - 2;j >= high + 1;j--){
a[j + 1] = a[j];
}
a[high + 1] = a[0];
}
for(int m = 0;m < a.length;m++){
System.out.print(a[m] + " ");
}
System.out.print("\n");
}
System.out.print("排序结束------(第一个是最后一个哨兵):\n");
return a;
}
}