1. 程式人生 > >Java實現陣列的快速排序(快速排序演算法)

Java實現陣列的快速排序(快速排序演算法)

/**************************************************************      
* Copyright (c) 2016, 
* All rights reserved.                   
* 版 本 號:v1.0                   
* 題目描述:快速排序演算法,從鍵盤輸入一組整數陣列,用快速排序輸出排序後的結果
* 輸入描述:請輸入要排序的陣列: 
*           48 15 24 59 64 79 97 40
* 程式輸出: 48 15 24 59 64 79 97 40
*			輸入的陣列是:
*			48 15 24 59 64 79 97 40 
*			排序後的陣列是:
*			15 24 40 48 59 64 79 97 
*			第二種寫法的輸出:
*			排序後的陣列是:
*			15 24 40 48 59 64 79 97 
* 問題分析:1.從鍵盤輸入一個整數字符串,將字串轉化為整數陣列
*       	解決方法:先將字串用str.split()轉化為字串陣列,再將字串陣列轉化為整數陣列
* 演算法描述:實現快速排序演算法的關鍵在於現在陣列中選擇一個數字,接下來把陣列中的數字分為兩部分,比選擇的數字小的數字移到陣列左邊,
* 			比選擇的數字大的數字移到陣列的右邊。
* 			1.	設要排序的陣列是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個元素)作為基準點,然後將所有比它小的數都放到它前面,
* 			所有比它大的數都放到它後面,這個過程稱為一趟快速排序,然後採用分治策略,分別以同樣的方式排序前面和後面的資料。
*			2.一趟快速排序的演算法是: 
*			1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1; 
			2)以第一個陣列元素作為基準點。 
			3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於A[i](此時基準點)的值A[j],將值與A[j]交換; 
			4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於A[j](此時基準點)的A[i],將A[j]與A[i]交換; 
			5)迴圈執行第3、4步,直到i=j; 
			6)到此找到基準點的下標,作為分治下標。 
			7)重複1-6步驟遞迴排序前半部分 
			8 )重複1-6步驟遞迴排序後半部分 

* 完成日期:2016-07-24
***************************************************************/  
 

package org.marsguo.offerproject;

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
class Sort_Array{
	//int[] s;
	//int i,j,key;
	/*建構函式,用於輸出使用者輸入的陣列*/
	public Sort_Array(int[] s){					
		System.out.println("輸入的陣列是:");
		for(int i = 0; i <s.length; i++){
			System.out.print(s[i] + " ");
		}
		System.out.println();
	}
	/*排序函式,引數為要排序的陣列、陣列的起始,陣列的末尾*/
	public void sortfun(int[] arrays,int start, int end){
		
		if(start>=end){								//判斷陣列的起始和終止是否相同,相同表示已經都全部排完,返回
			return;
		}
		int i = start;								//i指向陣列的起始位
		int j = end;								//j指向陣列的末位
		int key = arrays[i];						//選取陣列的第一位為關鍵字key,基準元素
		boolean flag = true;						//設定標誌位,用於判斷是i++還是j--;這個很重要
		//int temp;
		while(i != j){								//如果i≠j,表示還沒有比較完,即即關鍵字左右兩側還不是最小與最大
			if(flag){					
				if(key>arrays[j]){					//從後向前遍歷,找到小於key的值,
					swap(arrays,i,j);				//找到小於key的值後將arrays[i]與此值交換
					flag = false;
				}else{								//如果沒有找到的話j--,向前遍歷
					j--;
				}
			}else{								
				if(key<arrays[i]){					//從前向後遍歷,找到大於key的值
					swap(arrays,i,j);				//將此值與arrays[j]進行交換
					flag = true;
				}else{								//如果沒有找到話就將i++,向後遍歷
					i++;
				}
			}
		}
		sprint(arrays);								//列印每次排序後的陣列
		sortfun(arrays,start,j-1);					//遞迴呼叫,將基準元素的前半段陣列再用此方法進行排序,直到所有都排完為止。
		sortfun(arrays,i+1,end);					//遞迴呼叫,將基準元素的後半段陣列再用此方法進行排序,直到所有都排完為止。
//		sortfun(s[0],s[j],s[0]);
//		sortfun(s[j+1],s[s.length-1],s[j+1]);
	}
	/*交換函式,用於交換陣列中的兩個值,easy,*/
	public void swap(int[] array,int i,int j){			
		int temp;
		temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}
	/*sprint()函式用於列印每次排序後的結果,非必須,但可以顯示每次排序情況*/
	public void sprint(int[] arrays){			
		System.out.println("排序後的陣列是:");
		for(int i = 0; i <arrays.length;i++){
			System.out.print(arrays[i] + " ");
		}
		System.out.println(); 
	}
	
	/*第二種寫法:*/
	private int getMiddle(int[] sortArray,int low,int high){
		int key = sortArray[low];
		while(low<high){
			while(low <high && sortArray[high] >= key){
				high--;
			}
			sortArray[low] = sortArray[high];
			while(low < high && sortArray[low] <= key){
				low++;
			}
			sortArray[high] = sortArray[low];
		}
		sortArray[low] = key;
		return low;
	}
	public void quicksort(int[] sortArray, int low,int high){
		if(low<high){
			int middle = getMiddle(sortArray, low, high);
			quicksort(sortArray, low, middle-1);
			quicksort(sortArray, middle+1, high);
		}
		System.out.println("第二種寫法的輸出:");
		sprint(sortArray);
	}
}
public class Quick_sort {
	public static void main(String args[]){
	Scanner sc = new Scanner(System.in);			//從鍵盤輸入陣列
		System.out.println("請輸入要排序的陣列:");
		String str = sc.nextLine();						//將鍵盤輸入轉化為字串
		String[] temp = str.split(" ");					//將字串用“ ”分開轉化為字串陣列
		int[] s = new int[temp.length];					//定義一個整型陣列s
		for(int i = 0; i<temp.length; i++){				//將字串陣列強制轉化為整型陣列
			s[i] = Integer.parseInt(temp[i]);			//這種方法非常巧妙
		}
		Sort_Array sort_array = new Sort_Array(s);		//建立物件,並傳入陣列s
		sort_array.sortfun(s, 0, s.length-1);			//呼叫類的方法,用於排序陣列
	
		Sort_Array quickSort = new Sort_Array(s);
		quickSort.quicksort(s, 0, s.length-1);
		
		/*用集合的方法輸入不定長陣列:
		Scanner scanner = new Scanner(System.in);			//建立輸入掃描器
		System.out.println("請輸入要排序的陣列:");
		List  list = new LinkedList();
		while(scanner.hasNext()){						//迴圈,當掃描到有下一個元素的時候
			int elements = scanner.nextInt();				//獲得下一個元素並作為整數
			if(elements == 0){								//如果等於0,則輸入結束
				break;									//退出while迴圈
			}else{
				list.add(elements);						//否則放入集合中
			}
		}
		Integer[] intArray =  list.toArray(new Integer[0]);
		for(int i = 0; i<intArray.length;i++){
			System.out.println(intArray[i]);
		}
	*/
	}
}