2012-01-24 23 views
13

Tôi đã viết thuật toán sắp xếp bong bóng để sắp xếp danh sách được liên kết. Tôi là một người mới bắt đầu Java và đang cố gắng tìm hiểu cấu trúc dữ liệu. Tôi bối rối vì sao phần tử thứ hai của tôi không được sắp xếp đúng cách.Sắp xếp danh sách được liên kết trong Java

EDIT

class SListNode { 
    Object item; 
    SListNode next; 


    SListNode(Object obj) { 
    item = obj; 
    next = null; 
    } 


    SListNode(Object obj, SListNode next) { 
    item = obj; 
    this.next = next; 
    } 

} 
public class SList { 

    private SListNode head; 
    private SListNode temp; 

    public void sortList() { 
     SListNode node = head,i,j; 
     head = node; 
     i = node; 
     j = node.next; 
     while(i.next != null) { 
      while(j.next != null) { 
       if((Integer)i.item < (Integer)j.item) { 
        temp = i.next; 
        i.next = j.next; 
        j.next = temp; 
       } 
       j = j.next; 
      } 
      i = i.next; 
     } 
    } 
} 

Đây là sản phẩm tôi nhận được

List after construction: [ 3 6 9 4 12 15 ] 
After sorting: [ 3 4 9 12 6 15 ] 

Bên cạnh tôi biết trường hợp kịch bản tồi tệ nhất của một loại bong bóng là O (n). Tôi có thể sử dụng sáp nhập trên danh sách được liên kết để có độ phức tạp tốt hơn không?

Cảm ơn!

+0

'SListNode' là gì? Xem xét việc đăng triển khai. – paislee

+0

Nếu không trả lời trực tiếp, cách điều tra sẽ là System.out.println() danh sách của bạn sau mỗi lần hoán đổi và sau mỗi vòng lặp bên ngoài để xem điều gì đang xảy ra. – user949300

Trả lời

7

Có nhiều thuật toán sắp xếp hoạt động trên danh sách được liên kết và phối hợp hoạt động xuất sắc trong trường hợp này. Tôi đã viết an earlier answer to a question about sorting linked lists khám phá nhiều thuật toán phân loại cổ điển trên danh sách được liên kết, cùng với thời gian và không gian phức tạp của chúng. Bạn có thể sử dụng sắp xếp chèn, sắp xếp lựa chọn, hợp nhất và nhanh chóng trên danh sách được liên kết. Với một chút fudging, bạn cũng có thể nhận được heapsort làm việc. Câu trả lời cũ của tôi có chi tiết về cách thực hiện việc này.

Liên quan đến mã của bạn, hãy lưu ý rằng trong vòng lặp bên trong, bạn tiến lên j chuyển tiếp cho đến khi con trỏ next trở thành null. Tại thời điểm này, bạn không bao giờ đặt lại j là bất cứ điều gì khác, do đó, mỗi lần lặp lại tương lai của vòng lặp bên ngoài vòng lặp bên trong không bao giờ thực thi. Có thể bạn nên đặt j = i.next khi bắt đầu mỗi lần lặp lại. Hơn nữa, bạn có thể không muốn có vòng lặp dừng khi j.next là null, nhưng thay vì khi j là null, vì nếu không bạn bỏ qua phần tử cuối cùng của mảng. Ngoài ra, thuật toán sắp xếp bạn đã viết ở đây là selection sort thay vì loại bong bóng, bởi vì bạn đang thực hiện nhiều lần vượt qua danh sách được liên kết tìm kiếm phần tử nhỏ nhất mà bạn chưa định vị. Tôi không biết đây có phải là vấn đề hay không, nhưng tôi không chắc liệu bạn có nhận ra điều này không. Điều đó nói rằng, tôi nghĩ rằng đó có thể là một điều tốt, kể từ khi loại bong bóng là ít hiệu quả hơn lựa chọn sắp xếp trong hầu hết các trường hợp (trừ khi danh sách đã gần được sắp xếp).

Hy vọng điều này sẽ hữu ích!

+0

Không phải là sắp xếp sắp xếp đặt giá trị tối thiểu ở vị trí đầu tiên và lặp qua toàn bộ danh sách? – user525146

+1

@ user525146- Có, đó là chính xác, nhưng đó là những gì mã của bạn hiện đang làm. :-) Nó không hoàn toàn giống nhau bởi vì những gì bạn đang làm là liên tục hoán đổi các phần tử nhỏ xuống vị trí đầu tiên, nhưng nó có cùng hiệu ứng ròng (trên mỗi lần lặp, phần tử được lưu trữ trong 'i' sẽ có giá trị thấp nhất của giá trị còn lại). Sắp xếp bong bóng liên tục hoán đổi các cặp phần tử liền kề nằm ngoài vị trí cho đến khi không có nhiều hoán đổi được thực hiện, nhưng mã của bạn không làm điều đó. – templatetypedef

+0

Có điều gì đó sai trong vòng lặp trao đổi của tôi. Các kết quả không được đổi chỗ. Trước vòng lặp bên trong, tôi thêm j = i.next. Tôi in ra các kết quả trong vòng lặp sau khi chức năng trao đổi và có vẻ như nó không hoạt động. – user525146