划分算法与TopK问题

本文详细介绍了划分算法的思想,包括其在排序中的应用,特别是在快速排序中的基础作用。同时,文章探讨了如何利用划分算法解决TopK问题,提供了两种方法:一种是直接运用划分算法,另一种是使用优先队列。对于TopK问题,文章强调了正确选择枢纽元素以平均切分数组的重要性,并解释了为什么在循环条件中使用`<`而非`<=`的原因。
摘要由CSDN通过智能技术生成

1 划分算法思想

 划分(partition)就是将数据项分成两组,一组大于某个特定的数据项,而另一组小于某个特定的数据项。在划分算法中,这个特定的数据项叫做枢纽(pivot)。
 划分算法的思想是中间线代表枢纽;数据项的左端和右端分别有两个指针(leftPtr和rightPtr); leftPtr从左向右遍历元素,rightPtr从右向左遍历元素,当leftPtr遇到比枢纽元素大的元素时停止,当rightPtr遇到比枢纽元素小的元素时停止,然后将这两个元素交换位置;接下来,leftPtr继续向右遍历,rightPtr继续向左遍历,重复上面的操作;当两个指针相遇时遍历结束。


2 代码实现

//返回划分后pivot的位置pivotIndex,位于pivotIndex左边的数字小于pivot,右边的大于pivot
public static int partionIt(int[] a,int left, int right, long pivot) {
		int leftPtr=left-1;
		int rightPtr=right+1;
		while(true)
		{
			//from left to pivot
			while(leftPtr<right && a[++leftPtr]<pivot);
			//from right to pivot
			while(rightPtr>left && a[--rightPtr]>pivot);
			//base case
			if(leftPtr>=rightPtr)
				break;
			//swap
			else
				swap(a,leftPtr,rightPtr);
		}

		return leftPtr;
	}
	private static void swap(int[] a,int left, int right)
	{
		int temp=a[right];
		a[left]=a[right];
		a[right]=temp;
	} //end swap()
} //end partionIt

3 时间复杂度

算法时间复杂度O(N)。当在划分的2端有相同的数据需要比较和交换时,比较和交换各位N

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值