極客時間-排序-冒泡排序(鏈表實現)

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();

	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章