快速排序 quicksort 细节问题

#include <iostream>
using namespace std;

template <class ElementType>
int QuickPart(ElementType* iArray,int first,int last)
{
	/*
		1.将标准记录存储于temp中 temp = iArray[i]
		2.令j=last,将iArray[j]的值与temp比较,直到找到第一个temp>iArray[j]时停止,然后执行iArray[i++]=iArray[j]
		3.将iArray[i]的值与temp比较,知道找到第一个temp<iArray[i]时停止,然后执行iArray[j--]=iArray[i]
		4.反复执行2 3,直到i==j停止,执行iArray[i]=temp,返回i
	*/
	int i = first,j = last;
	ElementType temp = iArray[i];
	while(i != j)
	{
		while(i < j && iArray[j] > temp)
			j = j - 1;
		/*
			至于这里需要一个if判断,否则会出现错误
				例如当执行完上面的while,切只循环一次(也就是说last-first=1)
				i	 j
				|	 |
				1	100
				执行完while的一次循环i==j
				i=j
				 |
				 1
		*/
		if(i < j)
			iArray[i++] = iArray[j];
		/*
			假如没有if
				1=1
				之后
				j	i
				|   |
				1  100
		*/

		while(i < j && iArray[i] < temp)
			i = i + 1;
		/*
			上面的while不会执行
			假如没有if,但是下面这个iArray[j--] = iArray[i];会执行
			此时
				j	i
				|   |
				1  100
		*/
		if(i < j)
			iArray[j--] = iArray[i];
		/*
			执行完
			j	i
			|	|
		   100 100
		   由此会出现错误
		*/

	}
	iArray[i] = temp;
	return i;
}
template <class ElementType>
void QuickSort(ElementType* iArray,int first,int last)
{
	if(first >= last)return;
	int pos = QuickPart(iArray,first,last);
	QuickSort(iArray,first,pos-1);
	QuickSort(iArray,pos+1,last);
}
int main()
{
	int iArray[]={0,50,100,256,15,3,87,45,60,200,300};
	QuickSort(iArray,1,10);
	for(int i = 1; i <= 10; i++)
		cout<<iArray[i]<<" ";
		cout<<endl;
	char cArray[]={0,'d','f','q','z','g','y','i','o','m','h'};
	QuickSort(cArray,1,10);
	for(i = 1; i <= 10; i++)
		cout<<cArray[i]<<" ";
		cout<<endl;
	float fArray[]={0,1.2f,5.6f,10.9f,12.5f,0.5f,9.9f,80.5f,9.7f,2.2f,0.9f};
	QuickSort(fArray,1,10);
	for(i = 1; i <= 10; i++)
		cout<<fArray[i]<<" ";
		cout<<endl;
	return 0;
}
/*
	之前可能因为一些原因都没有发现这个细节,知道有个朋友问我为什么快排总是出现错误
	我才好好看了看,原来是这个原因
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值