1. 程式人生 > >快速排序(荷蘭國旗java)

快速排序(荷蘭國旗java)

經典的快速排序是思路如下:

(1)就是將弱化版的荷蘭國旗問題中的num,替換成了陣列的最後一個位置的數字,即根據陣列的最後的一個數字,作為比較物件,然後分出大於和小於部分

(2)然後將左右兩個子陣列分別進行遞迴

首先我們看看弱化版的荷蘭國旗問題:

給定一個數組arr, 和一個數num, 請把小於等於num的數放在陣列的左邊, 大於num的數放在陣列的右邊。
要求額外空間複雜度O(1), 時間複雜度O(N)
直接上其程式碼:

package NetherlandsFlag;

import java.util.Arrays;

public class NetherlandsFlagWeaken {

	public static void partition(int[] arr,int L,int R,int num) {
		int less=L-1;
		int current=L;
		while (current<R) {
			if (arr[current]<=num) {
				change(arr, current++, ++less);
			}else {
				current++;
			}
		}
		
	}
	//定義交換方法
		public static void change(int[] arr,int i,int j) {
			int tem=arr[i];
			arr[i]=arr[j];
			arr[j]=tem;
		}
}

根據這個可以直接上經典的快速排序

程式碼:

package NetherlandsFlag;

import java.util.Arrays;

public class QuickSort {
	public static void quickSort(int[] arr) {
		if (arr.length<2||arr==null) {
			return;
		}
		quickSort(arr,0,arr.length-1);
	}
	
	private static void quickSort(int[] arr, int L, int R) {
		if (L<R) {
			int p=partition(arr, L,R, arr[R]);
			quickSort(arr,L,p);
			quickSort(arr,p+1,R);
		}
	}

	public static int partition(int[] arr,int L,int R,int num) {
		int less=L-1;
		int current=L;
			while (current<R) {
				if (arr[current]<num) {
					change(arr, current++, ++less);
				}else {
					current++;
				}
			}
		   return less;
	}
	//定義交換方法
		public static void change(int[] arr,int i,int j) {
			int tem=arr[i];
			arr[i]=arr[j];
			arr[j]=tem;
		}
}

荷蘭國旗版程式碼:

package NetherlandsFlag;

import java.util.Arrays;

public class QuickSort1 {

	public static void quickSort(int[] arr) {
		if (arr.length<2||arr==null) {
			return;
		}
		quickSort(arr,0,arr.length-1);
	}
	
public static void quickSort(int[] arr, int L, int R) {
	if (L<R) {
		int[] p=partition(arr,L,R);
		quickSort(arr, L, p[0]);
		quickSort(arr, p[1], R);
	}
	}

public static int[] partition(int[] arr, int L, int R) {
	int less=L-1;
	int more=R+1;
	int current=L;
	
	while (current<more) {
		if (arr[current]<arr[R]) {
			change(arr, current++, ++less);
		}else if (arr[current]>arr[R]) {
			change(arr, current, --more);
		}else {
			current++;
		}
	}
	return new int[] {less,more};
}
public static void change(int[] arr,int i,int j) {
	int tem=arr[i];
	arr[i]=arr[j];
	arr[j]=tem;
}

}

在荷蘭國旗的基礎上還可以加上一個隨機快速排序:

程式碼:

package NetherlandsFlag;

import java.util.Arrays;

public class QuickSort1 {

	public static void quickSort(int[] arr) {
		if (arr.length<2||arr==null) {
			return;
		}
		quickSort(arr,0,arr.length-1);
	}
	
public static void quickSort(int[] arr, int L, int R) {
	if (L<R) {
		change(arr, R, 1+(int)Math.random()*(R-L+1));
		int[] p=partition(arr,L,R);
		quickSort(arr, L, p[0]);
		quickSort(arr, p[1], R);
	}
	}

public static int[] partition(int[] arr, int L, int R) {
	int less=L-1;
	int more=R+1;
	int current=L;
	
	while (current<more) {
		if (arr[current]<arr[R]) {
			change(arr, current++, ++less);
		}else if (arr[current]>arr[R]) {
			change(arr, current, --more);
		}else {
			current++;
		}
	}
	return new int[] {less,more};
}
public static void change(int[] arr,int i,int j) {
	int tem=arr[i];
	arr[i]=arr[j];
	arr[j]=tem;
}

}