[英]How to implement merge sort using LinkedList?
我正在嘗試使用LinkedList實現合並排序,到目前為止,
class Node{
Node next;
int data;
public Node (){
}
public Node(int _data){
this.data = _data;
}
}
public class myTest{
private static Node head;
private static Node current;
public void myTest(){
this.head = null;
this.current = null;
}
public static void insert( int data ){
Node newNode = new Node(data);
if (head == null){
head = newNode;
current = head;
}
else {
current.next = newNode;
current = newNode;
}
}
public static void display(Node cur ){
while( cur != null){
if (cur.next != null){
System.out.print(cur.data + " -> ");
}
else{
System.out.print(cur.data +" ");
}
cur = cur.next;
}
System.out.println();
}
private static Node mergeSort(Node headOriginal ){
if (headOriginal == null || headOriginal.next == null ){
return headOriginal;
}
Node a = headOriginal;
Node b = headOriginal.next;
while( b != null && b.next != null ){
headOriginal = headOriginal.next;
b = (b.next).next;
}
// split in 2 parts
b = headOriginal.next;
headOriginal.next = null;
return merge( mergeSort(a), mergeSort(b) );
}
// sort among the 2 parts
public static Node merge(Node a, Node b) {
Node c = new Node();
Node head_1 = c;
while ((a != null) && (b != null)) {
if ( a.data <= b.data ){
c.next = a;
c = a;
a = a.next;
}
else {
c.next = b;
c = b;
b = b.next;
}
}
c.next = (a == null) ? b : a;
return head_1.next;
}
public static void main(String[] args ){
int [] arr = {12, 34, 5, 6, 7};
for (int j =0; j < arr.length; j++){
insert( arr[j] );
}
mergeSort(head);
display(head);
}
}
mergeSort函數采用通過插入函數生成的LikedList的原始頭。 我相信該函數可以正確創建升序排序的LL。 顯示功能假定要打印LL。 在這種情況下,它僅從原始的打印頭(12)到分類的LL的末尾打印,並打印'12-> 34'。 我假設如果我可以通過新創建的已排序LL的頭部,那么它將能夠打印整個已排序的LL。
我想這是出於學術目的,因為Sandeep的評論是正確的,即LinkedList不是適合mergesort的數據結構。 並且編寫自己的鏈表也可能不是一個好主意,因為Java API數據結構經過了精心設計和測試!
但是對於您的代碼,它工作得很好! 唯一的錯誤是您沒有使用mergesort的結果,而是使用了“舊的”對head的引用。 如果您更新參考資料,那應該沒問題。 嘗試:
head = mergeSort(head);
display(head);
在您的主要方法中,它應該可以正常工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.