快速排序、堆排序、歸併排序

快速排序(帶輸入)


package com.lei.sort;
import java.util.Scanner;

public class quick_sort {

	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		String[] ss = null;
		while (true) {
			System.out.println("輸入數字,用空格隔開.輸入結束請換行輸入exit。");
			System.out.println();
			String temp = input.nextLine();
			if (temp.trim().equals("exit")) {
				break;
			}
			ss = temp.trim().split(" ");
		}
		int q = ss.length;
		int[] a = new int[q];
		for (int i = 0; i < q; i++) {
			a[i] = Integer.parseInt(ss[i]);
		}
		System.out.println("輸入的數字是:");
		System.out.println(Arrays.toString(a));
		System.out.println();
		System.out.println("輸入結束");
	
		quickSort(a, a.length);
		System.out.println("排序之後結果:");
		
		System.out.println(Arrays.toString(a));

	}

	public static void quickSort(int[] A, int n) {
		// write code here
		if (A == null || A.length < 2) {
			return A;
		}
		sort(A, 0, A.length - 1);
		

	}

	public static void sort(int a[], int left, int right) {

		if (left < right) {
			int index = find(a, left, right);
			sort(a, left, index - 1);
			sort(a, index + 1, right);

		}

	}

	public static int find(int a[], int left, int right) {

		int i = left;
		int j = right;
		int q = a[left];
		while (i < j) {

			while (i < j && q <= a[j]) {
				j--;
			}
			if (i < j) {
				a[i++] = a[j];
			}
			while (i < j && q >= a[i]) {
				i++;
			}
			if (i < j) {
				a[j--] = a[i];
			}
		}
		a[i] = q;
		return i;
	}

}

堆排序

<span style="font-size:14px;">package com.lei.sort;

//不穩定
import java.util.Arrays;

public class HeapSort {
  public static void main(String[] args) {
      int[] a={49,38,65,97,76,13,27,49,78,34,12,64};
      int arrayLength=a.length;  
      //循環建堆  
      for(int i=0;i<arrayLength-1;i++){  
          //建堆  
          buildMaxHeap(a,arrayLength-1-i);  
          //交換堆頂和最後一個元素  
          swap(a,0,arrayLength-1-i);  
          System.out.println(Arrays.toString(a));  
      }  
  }
  //對data數組從0到lastIndex建大頂堆
  public static void buildMaxHeap(int[] data, int lastIndex){
       //從lastIndex處節點(最後一個節點)的父節點開始 
      for(int i=(lastIndex-1)/2;i>=0;i--){
          //k保存正在判斷的節點 
          int k=i;
          //如果當前k節點的子節點存在  
          while(k*2+1<=lastIndex){
              //k節點的左子節點的索引 
              int biggerIndex=2*k+1;
              //如果biggerIndex小於lastIndex,即biggerIndex+1代表的k節點的右子節點存在
              if(biggerIndex<lastIndex){  
                  //若果右子節點的值較大  
                  if(data[biggerIndex]<data[biggerIndex+1]){  
                      //biggerIndex總是記錄較大子節點的索引  
                      biggerIndex++;  
                  }  
              }  
              //如果k節點的值小於其較大的子節點的值  
              if(data[k]<data[biggerIndex]){  
                  //交換他們  
                  swap(data,k,biggerIndex);  
                  //將biggerIndex賦予k,開始while循環的下一次循環,重新保證k節點的值大於其左右子節點的值  
                  k=biggerIndex;  
              }else{  
                  break;  
              }  
          }
      }
  }
  //交換
  private static void swap(int[] data, int i, int j) {  
      int tmp=data[i];  
      data[i]=data[j];  
      data[j]=tmp;  
  } 
}</span>

歸併排序

package com.lei.sort;


public class MergerSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] a = {54,35,48,36,27,12,44,44,8,14,26,17,28};
		mergeSort(a, a.length);
		for (int i = 0; i < a.length; i++) {
			System.out.println(a[i]);
		}
	}
	public static void mergeSort(int[] A, int n) {
    	
		 fen(A, 0, n-1); 
		
        }
	
	public static void fen(int [] a,int left,int right){
		if (left>=right) {
			return ;
		}
		int mod = (left+right)/2;
		// 繼續劃分成 2份 
		fen(a, left, mod);
		fen(a, mod+1, right);
		//合併兩個
		sort(a, left, right);
	}
	
	public static  void sort (int [] A ,int left,int right){
		
		
		int []temp = new int [right-left+1];
		int tempmid = (left+right)/2;
		int templeft= left;
		int tempright= tempmid+1;
		
		int i= 0;
		while (templeft<=tempmid && tempright<=right) {
			
			if (A[templeft]<A[tempright]) {
				temp[i++] = A[templeft++];
			}else {
				temp[i++] = A[tempright++];
			}
			
		}
		
		while (templeft<=tempmid) {
				temp[i++]=A[templeft++];
		}
		while (tempright<=right) {
				temp[i++]=A[tempright++];
		}
		int j=0;
		while (j<=temp.length-1) {
			A[left++]=temp[j++];
		}
	}

}





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