快排(QuickSort)的java語言的實現
阿新 • • 發佈:2019-02-05
快速排序
快排的思想與前面所介紹的歸併排序的思想類似,也是採用了分治法
演算法思想如下:
- 第一步:分解,陣列arr[l..r]別分為兩個子陣列arr[l..q-1]和arr[q+1..r],使得前面一個數組的元素小於等於arr[q],後面一個子陣列的元素全部大於arr[q];
- 第二步:解決,通過遞迴呼叫快速排序,對兩個子陣列進行排序
- 第三步:合併,因為子陣列都是原址排序的,所以是不需要合併操作的。
java實現的程式碼如下:
package org.wrh.algorithmimplements;
import java.util.Arrays;
import java.util.Scanner;
//快速排序的實現
public class QuickSort {
public static void main(String[] args) {
//int []a={5,8,6,4,6,7,9,2,4,1,3,6,5,7};
/**
* 從控制檯輸入一個數組
*/
int [] a=new int[10];
Scanner sc=new Scanner(System.in);
for(int i=0;i<a.length;i++){
System.out.println("請輸入一個數:" );
a[i]=sc.nextInt();
}
System.out.println("快速排序之前的陣列如下:"+Arrays.toString(a));
quickSort(a,0,a.length-1);
System.out.println("快速排序之後的陣列如下:"+Arrays.toString(a));
}
public static void quickSort(int arr[],int l,int r){
int q;
if(l<r){
/*
* 得到主元元素的位置下標
* */
q=partition(arr,l,r);
quickSort(arr,l,q-1);
quickSort(arr,q+1,r);
}
}
public static int partition(int []arr,int l,int r){
//選取第一個元素作為主元,也可以選取任意位置的元素作為主元
int x=arr[l];
int i=l;
for(int j=l+1;j<=r;j++){
/*
* 小於等於主元的陣列元素放在主元元素的左邊,其他的放在右邊
* */
if(arr[j]<=x){
i++;
swap(arr,i,j);
}
}
swap(arr,i,l);
return i;
}
public static void swap(int [] arr,int m,int n){
int temp=arr[m];
arr[m]=arr[n];
arr[n]=temp;
}
}
程式碼實現的比較簡單,這裡就不詳細的講解了。
總結
- 快速排序通常是實際排序應用中最好的選擇,因為他的平均效能是最好的:他的期望複雜度是O(nlogn);
- 但最差的情況的時間複雜度是O(n^2)
關於更多的快速排序以及快速排序的C語言實現,你可以點選這裡