import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class Test {
public void test() {
//int[] test = {5,4,3,2,1};
int[] test={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
//int[] test={56,17,18,23,34};
insertionSortByList(test);
}
public void showList(List a) {
Iterator ite = a.iterator();
while( ite.hasNext() ) {
System.out.format("%d ", (int)ite.next());
}
System.out.format("\r");
}
public void insertionSortByList(int[] a ) {
List list = new LinkedList<>();
List newList = new LinkedList<>();
//将数组转存到List
for( int cnt=0;cnt<a.length;cnt++ ) {
list.add(a[cnt]);
}
/*分别从List的左右两边进行处理:
* 左边遍历比较,并插入;右边遍历选择,并删除
*
* 利用链表的删除、插入在效率上的优势,优化基于数组进行移位操作的时间复杂度,但是链表会提升空间复杂度,并且链表的遍历效率比数组低*/
if( list.size() <= 1 ) {
//没必要排序
return;
}
newList.add(list.remove(0));
int key = 0;
int innerKey = 0;
Iterator ite = list.iterator();
while( ite.hasNext() ) {
key = (int)ite.next(); /*外层循环,每次取原数组(待排序)的第一个数据*/
/*从后往前比较*/
int index = 0;
ListIterator innerIte = newList.listIterator(newList.size());
while( innerIte.hasPrevious() ) {
innerKey = (int)innerIte.previous();
if( key >= innerKey ) {
index = innerIte.nextIndex()+1; /*基于array的算法,这里不用做操作,循环自动结束,直接赋值即可。当key<innerKey时需要将数组移位。*/
break;
}
}
/*内层循环结束,将innerKey插入newList中迭代器当前的位置*/
newList.add(index, key);
ite.remove();
//showList(newList);
}
showList(newList);
}
// public void testtt() {
// Arrays.sort(a);
// }
}
/*
* 综述
*
* */