快速排序(荷兰国旗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;
}

}

猜你喜欢

转载自blog.csdn.net/zhou_438/article/details/84921247