Java實現陣列的快速排序(快速排序演算法)
阿新 • • 發佈:2019-01-09
/************************************************************** * 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]); } */ } }