快速排序的坑

写了程序这几年,连个快速排序都默写不出来,我真是担心我的前途未来
以下是一些细节要注意的地方,不过我相信很多人如果默写快排的话也会死在这几点上的
#1:
这行最重要了,如果这个判断不加的话,当i==j且pData[i]==middle的时候就死循环了
#2:
不加就死循环了

PS:
网上查了一些快排的算法,有些也是错的


void QuickSort(int *pData, int left, int right)
{
	int i = left, j = right, middle = 0;
	middle = pData[(left + right) / 2]; //中间值
	do
	{
		//从左扫描大于中值的数
		while ((pData[i] < middle) )	
			i++;
		//从右扫描小于中值的数
		while ((pData[j] > middle) )    
			j--;
		//找到了一对值,交换
		if (i <= j)									// #1
		{
			SWAP(pData[i], pData[j]);
			i++;
			j--;
		}
	} while (i <= j);//下标交错,停止				
	//当左边部分有值(left<j),递归左半边
	if (left < j)									// #2
	{
		QuickSort(pData, left, j);
	}
	//当右边部分有值(right>i),递归右半边
	if (right > i)
	{
		QuickSort(pData, i, right);
	}
}

int main()
{
	int buf[] =
	{ 1, 3, 6, 8, 3, 2, 4, 5, 6, 8 };
	Qsort(buf, 10);
	for (int i = 0; i < 10; i++)
	{
		cout << buf[i] << endl;
	}
	return 0;
}


你可能感兴趣的:(快速排序的坑)