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); // } } /* * 综述 * * */