import java.util.Random;
public class LinkBubble {
public Node head;
private Integer num;
public void init(int num,Node node) {
this.num=num;
this.head=node;
}
class Node{
private Integer data;
private Node next;
}
/*使用尾插發創建鏈表*/
public void createLink() {
Random random=new Random(1);
Node tail=head;
Integer datas[]= {10,25,19,26,5,25,27,19,1,20};
for(int i=0;i<num;i++) {
/*Integer data=(int) (1+Math.random()*(30-1));*/
System.out.print(datas[i]+" ");
Node newNode=new Node();
newNode.data=datas[i];
tail.next=newNode;
tail=newNode;
}
bubbleSort();
}
/*
* 冒泡排序:
* 1.每次循環至少把一個數放到該在的位置
* 2.每排序一次,比較次數減少一次
* 3.當某一次一次都不需要移動時說明已經完全有序了
* 4.需要排序的次數就是原始數組的逆序數
*/
public void bubbleSort() {
for(int i=0;i<num;i++) {
Node tail=head.next;
Node preNode=head;
boolean flag=true;
for(int j=0;j<num-i;j++) {
if(tail!=null&&tail.next!=null) {
Node nextNode=tail.next;
Integer data1=tail.data;
Integer data2=nextNode.data;
if(data1>data2) {
tail.next=nextNode.next;
preNode.next=nextNode;
nextNode.next=tail;
preNode=nextNode;
flag=false;
}else {
preNode=tail;
tail=tail.next;
}
}else {
break;
}
}
if(flag) {
System.out.println("\n數組已經有序,不需要再排序");
break;
}
//每次排序結果輸出
Node outNode=head.next;
outPrint(outNode,i+1);
}
}
public void outPrint(Node node,int i) {
System.out.print("\n第"+i+"次排序得到");
while(node!=null) {
System.out.print(node.data+" ");
node=node.next;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkBubble link=new LinkBubble();
link.init(10, link.new Node());
link.createLink();
}
}