日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

java链表排序方法_java链表排序(Java中@)

發布時間:2023/12/19 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 java链表排序方法_java链表排序(Java中@) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

插入排序

對鏈表進行插入排序,是最簡單的一種鏈表排序算法,用于插入排序是迭代的,所以每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
每次迭代中,插入排序只從輸入數據中移除一個待排序的元素,找到它在序列中適當的位置,并將其插入。重復直到所有輸入數據插入完為止。
插入排序的時間復雜度為O(N^2),空間復雜度為O(1)

class Solution { 
   
    public ListNode insertionSortList(ListNode head) { 
   
             ListNode move=head;
             ListNode emptyHead=new ListNode();
             emptyHead.next=head;
             while(move!=null&&move.next!=null){ 
   
                 if(!reInsert(move,emptyHead)) 
                     move=move.next;
             }
             return emptyHead.next;
    }
    private Boolean reInsert(ListNode node,ListNode emptyHead){ 
   
        ListNode temp=node.next;
        node.next=temp.next;
        while(emptyHead!= node){ 
   
            if(temp.val<=emptyHead.next.val){ 
   
                temp.next=emptyHead.next;
                emptyHead.next=temp;
                return true;
            }
            emptyHead=emptyHead.next;
        }
        temp.next=node.next;
        node.next=temp;
        return false;
    }
}

歸并排序

對于歸并排序排序在數組排序中的運用,詳細請點擊此處。這里主要介紹歸并排序在鏈表排序中的運用。
在使用歸并排序算法進行鏈表排序時,其基本思想是將鏈表細分成一個個子鏈表,將子鏈表進行排序,然后再將相鄰的兩個有序子鏈表進行合并,得到更長的有序鏈表,最后一步步得到整個有序鏈表,子鏈表進行合并排序時需要用到合并兩個有序鏈表算法。
歸并鏈表排序的實現方式一共有兩種,遞歸實現和非遞歸實現,兩種實現方式的時間復雜度都是O(nlogn),但是由于遞歸實現調用函數時需要消耗大量棧空間,所以遞歸調用的空間復雜度是O(logn)。對于非遞歸調用,空間復雜度就是O(1)。

遞歸代碼:

class Solution { 
   
    public ListNode sortList(ListNode head) { 
   
        if(head==null)
          return head;
       return mergeSort(head);
    }
    public ListNode mergeSort(ListNode head){ 
   
        if(head.next==null)
            return head;
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){ 
   
            fast=fast.next.next;
            if(fast!=null)
            slow=slow.next;
        }
        ListNode tempHead=slow.next;
        slow.next=null;
        ListNode left=mergeSort(head);
        ListNode right=mergeSort(tempHead);
        head=mergeList(left,right);
        return head;
    }
    public ListNode mergeList(ListNode head,ListNode tempHead){ 
   
        ListNode emptyHead=new ListNode(0,head);
        ListNode move=emptyHead;
        while(head!=null&&tempHead!=null){ 
   
            if(head.val<= tempHead.val){ 
   
                move.next=head;
                head=head.next;
            }else{ 
   
                move.next=tempHead;
                tempHead=tempHead.next;
            }
            move=move.next;
        }
        move.next=head==null?tempHead:head;
        return emptyHead.next;
    }
}

非遞歸代碼:

class Solution { 

public ListNode sortList(ListNode head) { 

if(head==null)
return null;
ListNode end=head;
int length=0;
while(end!=null){ 

length++;
end=end.next;
}
ListNode emptyHead = new ListNode(0, head);
for(int i=1;i<length;i<<=1){ 

ListNode prev = emptyHead;
ListNode cur = emptyHead.next;
while(cur!=null) { 

ListNode start1 =cur;
for (int j = 1; j < i&&cur.next!=null; j++) { 

cur = cur.next;
}
ListNode start2 = cur.next;
cur.next = null;
cur = start2;
for (int j = 1; j < i && cur != null&&cur.next!=null; j++) { 

cur = cur.next;
}
if(cur!=null){ 

ListNode temp=cur;
cur=cur.next;
temp.next=null;
}
prev.next = mergeList(start1, start2);
while(prev.next!=null){ 

prev=prev.next;
}
}
}
return emptyHead.next;
}
public ListNode mergeList(ListNode head,ListNode tempHead){ 

ListNode emptyHead=new ListNode(0,head);
ListNode move=emptyHead;
while(head!=null&&tempHead!=null){ 

if(head.val<= tempHead.val){ 

move.next=head;
head=head.next;
}else{ 

move.next=tempHead;
tempHead=tempHead.next;
}
move=move.next;
}
move.next=head==null?tempHead:head;
return emptyHead.next;
}
}

總結

以上是生活随笔為你收集整理的java链表排序方法_java链表排序(Java中@)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。