关于插入排序的Java模板

本文详细介绍了两种插入排序算法——直接插入排序和折半插入排序。直接插入排序通过将每个元素插入到已排序序列的正确位置来实现排序。而折半插入排序则是在直接插入排序的基础上,使用二分查找法来提高查找插入位置的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 插入排序的基本方法是:每步将一个待排序的元素,按其排序码的大小,插入到
 * 前面已经排好序的一组元素的恰当位置,直到元素全部插入为止。
 */
public class InputSort<E extends Comparable<E>>
{
	private E[] elemnetArray;
	private int length;
	public InputSort(E[] array) 
	{
		elemnetArray = array;
		length = array.length;
	}
/*
 * 直接插入排序的基本思想是:当插入第i(i>=1)个元素时,前面的V[0],V[1],...V[i-1]已经
 * 排好序。这时,用V[i]的排序码与V[i-1],V[i-2],...的排序码顺序进行比较,找到插入位置即
 * 将V[i]插入,原来位置上的元素向后顺移。	
 */
	public void directInputSort() 
	{
		for (int i = 1; i < elemnetArray.length; i++) 
		{
			
			E target = elemnetArray[i];
			if (target.compareTo(elemnetArray[i-1])<0) 
			{
				int j = i-1;
				do {
					elemnetArray[j+1] = elemnetArray[j];
					j--;
				} while (j>=0&&elemnetArray[j].compareTo(target)>0);
				elemnetArray[j+1] = target;
			}
			
			
		}
	}
/*
 * 折半插入排序又称为二分法插入排序,其基本思想是:设在数据表中有一个元素序列V[0],V[1],...V[n-1].
 * 其中,V[0],V[1],...,V[i-1]是已经排好序的元素。在插入V[i]时,利用折半搜索法寻找V[i]的位置。	
 */
	public void  binaryInputSort() 
	{
		for(int i=1;i<length;i++)
		{
			if (elemnetArray[i].compareTo(elemnetArray[i-1])<0) 
			{
				int low = 0;
				int high = i-1;
				E target = elemnetArray[i];
				if (low<high) 
				{
					//折中查找
					
					while(low<high)
					{
						int mid = (low+high)/2;
						if (target.compareTo(elemnetArray[mid])<0) 
						{
							//向左缩小区间
							high = mid-1;
						}
						else 
						{
							//向右缩小区间
							low = mid +1;
						}
					}
					
					//此时,low等于high
					for(int k=i-1;k>=low;k--)
					{
						elemnetArray[k+1] = elemnetArray[k];
					}
					elemnetArray[low] = target;
				}
				else 
				{
					//算法第一次,交换a[0]、a[1]的值,代码设计上有待优化
					E temp = elemnetArray[0];
					elemnetArray[0] = elemnetArray[1];
					elemnetArray[1] = temp;
				}
				
			}
			
		}
	}
	
	public void print() 
	{
	
		for (int i = 0; i < elemnetArray.length; i++) {
			
			System.out.println(elemnetArray[i]);
		}
	}
}

Example for the model:

		Integer[] array4 = {36,3,2,5,9,1,4,8};
		InputSort<Integer> test4 = new InputSort<>(array4);
		test4.binaryInputSort();
		test4.print();

Result of the example:

1
2
3
4
8
5
9
36

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值