我很难理解快速排序。这是我到目前为止的理解
现在我的问题是我不明白如何继续最后一步是递归。到目前为止,我有以下内容。我只想要一个非常基本的。该数组不会有重复
void quickSort(int *ptr,int lowindex , int highindex)
{
int left = lowindex ;
int right = highindex;
int pivot = ptr[rand()%highindex];
while(left < right)
{
while(ptr[left] < pivot)
{
left++;
}
while(ptr[right] > pivot)
{
right--;
}
//Now swap the two
int temp = ptr[left];
ptr[left] = ptr[right];
ptr[right] = temp;
}
std::cout << "Current Array is : ";
for(int i=0;i<7;i++)
{
std::cout << ptr[i] << "," ;
}
std::cout << "\n";
//How to add recursion ?
}
while(left < right)
循环也有可能被卡住 - 即左右不变,所以它继续循环?如果是这样我该如何处理呢?
答案 0 :(得分:0)
这一行
int pivot = ptr[rand()%highindex];
应该是
int pivot = ptr[lowindex+rand()%(highindex-lowindex+1)];
假设有效范围介于lowindex
和highindex
之间。但即便这样你也会遇到一个问题,即你不知道枢轴是属于左边还是右边的部分,更容易从固定位置挑选它,比如pivot=ptr[lowindex]
。
你的一个比较操作应该包括相等,比如
while( ptr[left] <= pivot )
最后,你会发现枢轴之外的left
指针,以及right
指针的右侧。在这种情况下,您不能进行交换操作。
if( left < right ){ // swap
分区后,您需要确保枢轴值在两个部分之间结束
swap( ptr[lowindex /*pivot*/], ptr[right] );
最后,对于递归,您可以在函数末尾添加如下内容:
quickSort( ptr, lowindex, right-1 );
quickSort( ptr, left, highindex );
虽然一般概念看起来相当简单,但细节有点难以实现。做好一些调试准备。希望这会有所帮助。