我有这种快速排序实现来对字符进行排序。
int main(){
char val[] = "dcbeaaae";
QuickSort(val, 0, length);
for(int i=0;i<length;i++) //Sorted print
cout<<val[i];
return 0
}
void QuickSort(char values[], int first, int last)
{
if(first<last)
{
int splitPoint;
Split(values, first, last, splitPoint);
QuickSort(values, first, splitPoint-1);
QuickSort(values, splitPoint+1, last);
}
}
void Split(char values[], int first, int last, int& splitPoint)
{
int splitVal = values[first];
int saveFirst = first;
bool onCorrectSide;
first++;
do
{
onCorrectSide = true;
while(onCorrectSide)
{
if(values[first] > splitVal)
onCorrectSide = false;
else
{
first++;
onCorrectSide = (first<=last);
}
}
onCorrectSide = (first<=last);
while(onCorrectSide)
if(values[last] <= splitVal)
onCorrectSide = false;
else
{
last--;
onCorrectSide = (first<=last);
}
if(first<last)
{
Swap(values[first], values[last]);
first++;
last--;
}
}while(first<=last);
splitPoint = last;
Swap(values[saveFirst], values[splitPoint]);
}
void Swap(char& item1, char& item2)
{
char temp = item1;
item1 = item2;
item2 = temp;
}
但是,我从中获得的输出有点不对,即在这些排序字符的开头有一个额外的空格。在设置断点时,我在索引0
看到,元素是= 0
输入:aaabcdee
输出:aaabcdee
(第一个a之前的一个额外空格)
我在这里错过了什么建议?
答案 0 :(得分:6)
假设length
是字符数组中的字符数(不包括NUL字符)。您需要将快速排序功能称为:
QuickSort(val, 0, length-1);
因为函数QuickSort
的最后一个参数是数组的最后一个元素的索引,并且在长度为length
的字符数组中,该索引为length - 1
。
通过将length
传递给你正在制作的函数,即使是NUL字符也参与排序,因为它比其他字符小,它会被移动到排序数组的开头,打印出来时作为空白打印