有序链表可以用于一种高效的排序机制。假设一个无序数组,从数组中取出数据,然后依次插入有序链表,他们自动地有序排列,把它们从有序表中删除,重新放入数组,那么数组就会排好序了。这种排序方式总体上比在数组中用常用的插入排序效率更高,对一个数据的排序只需2次复制,而一般的简单排序法则平均N/2步。
具体代码如下:
Link链表节点类
- package linklist;
- public class Link {
- public int iData; //data item
- public double dData; //data item
- public Link next; //next link in list
- //.....................................................
- public Link(int id,double dd)
- {
- iData=id;
- dData=dd;
- }
- //.....................................................
- public void displayLink()
- {
- System.out.print("{"+iData+","+dData+"}");
- }
- }//end class Link
- package linklist;
- public class SortedList
- {
- private Link first; //ref to first item on list
- //.....................................................
- public SortedList() //constructor
- {
- first=null; //initialize list
- }
- //.....................................................
- public SortedList(Link[] linkArr) //constructor(array as arg)
- {
- first=null;
- for(int j=0;j<linkArr.length;j++)
- insert(linkArr[j]);
- }
- //.....................................................
- public void insert(Link k)// insert item into list(in order)
- {
- Link previous=null;
- Link current=first; //start at first
- while(current!=null&&k.dData>current.dData)//until end of list,
- { //,or key>current.dData
- previous=current;
- current=current.next; //go to next item
- }
- if(previous==null) //at beginning of list
- first=k; //first-->k
- else //not at beginning
- previous.next=k; //old prev-->k
- k.next=current; //k-->current把K插入到pre和cur之间
- }//end insert()
- //.....................................................
- public Link remove() //返回first并把first后移
- {
- Link temp=first;
- first=first.next;
- return temp;
- }
- //.....................................................
- }
应用类(主函数):
- package linklist;
- //listInsertionSort.java
- //demonstrates sorted list used for sorting
- /
- public class listInsertionSort
- {
- public static void main(String[] args)
- {
- int size=10;
- Link[] linkArray=new Link[size];
- for(int j=0;j<size;j++)
- {
- int n=(int)(java.lang.Math.random()*99);
- Link newLink=new Link(n,n);
- linkArray[j]=newLink;
- }
- System.out.print("Unsorted array:");
- for(int j=0;j<size;j++)
- System.out.print(linkArray[j].dData+" ");
- System.out.println(" ");
- //create new list
- //initialized with array
- SortedList theSortedList=new SortedList(linkArray);
- for(int j=0;j<size;j++)
- linkArray[j]=theSortedList.remove();
- System.out.print("Sorted Array: ");
- for(int j=0;j<size;j++)
- System.out.print(linkArray[j].dData+" ");
- System.out.println(" ");
- }//end main()
- }//end class ListInsertionSort
- ///
返回的结果每次都会不同,因为数据产生使用了随机数。以下为其中一次产生的结果
- Unsorted array:66.0 20.0 45.0 48.0 2.0 83.0 8.0 34.0 22.0 80.0
- Sorted Array: 2.0 8.0 20.0 22.0 34.0 45.0 48.0 66.0 80.0 83.0