java实现排序算法之2-路插入排序,直接插入排序,折半插入排序

package insert;



import java.util.Arrays;


/**
 * @author
 */
public class InsertSort {
public static void main(String[] args) {
InsertSort sort = new InsertSort();
int []a = new int[]{33,9,34,12,6,10,8,9,32,1};
sort.twoWayInsertSort(a);
System.out.println(Arrays.toString(a));
}
/**
* 二路插入排序
* 二路插入排序利用一个数组作为辅助空间
* 将原数组a[0]中的值复制到辅助数组b[0]中,
* 搜索a[1]到a[length-1]的值小于a[0]的放在b[0]左边
* 大于a[0]的放在b[0]右边,用first和final分别指示b[0]左边和右边新插入数的数组下标,初始时first=final=0;
* 由于b[0]已经是数组边界,所以采用循环数组的方法(理解时,将数组首尾相接,左边的值放在b[0]左边,即(first-1+length)/2)
* 右边即final+1;
*/
public void twoWayInsertSort(int []a){
int first=0, finals = 0;
int length = a.length;
int []b = new int[length];
b[0] = a[0];
for(int i = 1; i < length; i++){
if(a[i] > b[finals]){
finals++;
b[finals] = a[i];
}
if(a[i] < b[first]){
first=(first-1+length)%length;
b[first]=a[i];
}
if(a[i] > b[first] && a[i]< b[finals]){//用循环数组理解
int j = finals;
finals++;
while(a[i] <= b[j]){
b[(j+1)%length] = b[j];
j = (j-1+length)%length;//循环数组理解
}
b[(j+1)%length] = a[i];//若j停留在数组在数组最后的位置(j+1)%length
}
for(int k:b){
System.out.print(k+" ");
}
}
/*
* 将数组从新复制到a[]数组中
*/
for(int i = 0; i < length;i++){
a[i] = b[(first++)%length];
}
}
/**
* @param a int数组
* 直接插入排序时间复杂度o(n^2)
*/
public void AInsertSort(int []a){
for(int i = 1; i < a.length; i++){
int t = a[i];
int j = i-1;
if(t < a[j]){//如果t>a[j]本来就是有序数组,不用在循环
for(;j >= 0;j--){
if(t < a[j])
{
a[j+1] = a[j];
}else{
break;
}
}
a[j+1] = t;
}
}
}
/**
* @param a
* 折半插入排序
*/
public void BInsertSort(int []a){
int length = a.length;
int middle;
int t;
for(int i = 1; i < length;i++){
t = a[i];
int low = 0,high = i-1;
while(low<=high){
middle = (low+high)/2;
if(a[middle] <= t) low=middle+1;
else high = middle - 1;
}
for(int j = i-1; j>=low;j--){
a[j+1] = a[j];
}
a[low] =t;
}
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值