public class InsertSort {
/**
* 直接插入:先确定一个有序列表,再不断取元素插入有序列表,扩大范围
* @param arrays
* @param length
* @param isUp
* @return
*/
public static int[] insertDirect(int[] arrays,int length,boolean isUp){
for(int i = 1;i < length;i++){
int p = i;
int tmp = arrays[i];
if(isUp){//小到大
while(p>0&&arrays[p-1]>tmp){
arrays[p] = arrays[p-1];
p--;
}
arrays[p] = tmp;
}else{//大到小
while(p>0&&arrays[p-1]<tmp){
arrays[p] = arrays[p-1];
p--;
}
arrays[p] = tmp;
}
}
return arrays;
}
/**
* 折半插入:在直接插入的基础上,在有序序列中折半缩小范围,减少比较次数
* @param arrays
* @param length
* @param isUp
* @return
*/
public static int[] brinayInsert(int[] arrays,int length,boolean isUp){
for(int i = 1;i < length;i++){
int tmp = arrays[i];
int start = 0;
int end = i;
while(start<end){
int mid = start+(end-start)/2;
if((tmp >= arrays[mid])&&(isUp==true)){
start = mid+1;
}else if((tmp <= arrays[mid])&&(isUp==false)){
start = mid+1;
}else{
end = mid;
}
}
int p = i;
while(p>end){
arrays[p] = arrays[p-1];
p--;
}
arrays[p] = tmp;
}
return arrays;
}
/**
* shell排序,在直接插入的基础上升级
* @param arrays
* @param length
* @param isUp
* @return
*/
public static int[] shellSort(int[] arrays,int length,boolean isUp){
int len = length/2;
while(len >= 1){
for(int i = len;i<length;i += len){
int p = i;
int tmp = arrays[i];
if(isUp){//小到大
while(p>0&&arrays[p-len]>tmp){
arrays[p] = arrays[p-len];
p -= len;
}
arrays[p] = tmp;
}else{//大到小
while(p>0&&arrays[p-len]<tmp){
arrays[p] = arrays[p-len];
p -= len;
}
arrays[p] = tmp;
}
}
len = len/2;
}
return arrays;
}
}
插入排序
最新推荐文章于 2025-08-11 19:37:52 发布