/*
* 插入排序的基本方法是:每步将一个待排序的元素,按其排序码的大小,插入到
* 前面已经排好序的一组元素的恰当位置,直到元素全部插入为止。
*/
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