前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >荷兰国旗-快排应用

荷兰国旗-快排应用

作者头像
sr
发布2018-08-20 10:13:30
5740
发布2018-08-20 10:13:30
举报
文章被收录于专栏:swag codeswag code

荷兰国旗问题:

”荷兰国旗难题“是计算机科学中的一个程序难题,它是由Edsger Dijkstra提出的。荷兰国旗是由红、白、蓝三色组成的。

现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。

ps:我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。

分析

arr[i]< key时相当于“荷兰国旗问题”中的0

arr[i]= key时相当于“荷兰国旗问题”中的1

arr[i]> key时相当于“荷兰国旗问题”中的2

这样就可以使用“荷兰国旗问题”的解法来解决快速排序了,这样一来,即使待排序的元素中有一些元素和key一样,也能保证时间复杂度是最差是NlogN的,因为对于待排序的等于Key的数值,可以在执行下一次Partition时直接跳过,利于数据规模的降低。


代码语言:javascript
复制
public class NetherlandsFlag {
	//荷兰国旗
	public static int[] partition(int[] arr,int L,int R,int p) {
		int less=L-1;
		int more=R+1;
		while(L<more) {
			if(arr[L]<p) {
				swap(arr,++less,L++);
			}else if(arr[L]>p) {
				swap(arr,--more,L);
			}else {
				L++;
			}
			
		}
		return new int[] {less+1,more-1};
		
	}
    //随机数组
	public static void swap(int[] arr, int i, int j) {
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
		
	}
	public static int[] getArray() {
		int arr[]=new int[10];
		for(int i=0;i<arr.length;i++) {
			arr[i]=(int)(Math.random()*3);
		}
		return arr;
	}
	public static void printArray(int arr[]) {
		if(arr==null) {
			return ;
		}
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
		}
		System.out.println();
		
	}
	public static void main(String args[]) {
		int test[]=getArray();
		printArray(test);
                //p值为1,用来判断0,1,2                                           
		int res[]=partition(test,0,test.length-1,1);
		printArray(test);
		System.out.println(res[0]);
		System.out.println(res[1]);
	}

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档