现在的位置: 首页 > 综合 > 正文

排序之表插入排序

2013年11月23日 ⁄ 综合 ⁄ 共 783字 ⁄ 字号 评论关闭

      所谓表插入排序,是利用一个有序链表,将无序数组的元素依次插入有序链表中,则元素自动按顺序排列,然后循环删除表头元素,并重新放入数组,即排好序。

      在效率上,在有序链表中插入数据,平均比较次数为 N/2, 插入N个数据, 比较次数为 N^2/4,即 O(N^2). 但复制仅需两次,一次从数组到链表,一次从链表到数组,对N个元素为 2*N 次,即 O(N).

       对于有现成有序链表的情况来说,这是个不错的选择, 它的算法实际在有序链表的插入操作中实现, 由于链表的插入,删除效率很高, 都为O(n),且不需移动元素。 但是注定它不能用在大型的数组排序中, 它不但需要一个现成的有序链表结构,而且在内存中占用双倍的空间。

 代码片断
 /*
  insert the elements of array into the sorted list
  then remove them and copy the returned elem
  back into a array, finally return it.
 */

 public void sort () {
       ListNode[] nodeArray = new ListNode[maxSize]; // 根据要排序数组的大小生成链表结点的数组
  
     for (int i=0; i<maxSize; i++) {
         nodeArray[i] = new ListNode (array[i]); // 根据数组中元素类型生成结点
         list.insert (nodeArray[i]);                       // 在链表中插入结点
     }
     for (int i = 0; i<maxSize; i++) {
         array[i] = list.removeHead().getData()// 移除头结点并复制回数组
     }
 }

抱歉!评论已关闭.