#include <iostream>
#include <string>
using namespace std;
//Iterates over the string array appNames displaying each application
//name in a separate line. There are appCount elements in the array
void displayAllApplicationNames(string appNames[], int appCount);
//Swaps strings in string array appNames between appIndex1 and appIndex2
void swapAppNames(int appIndex1, int appIndex2, string appNames[]);
//Splits string array appNames around a pivot index p (the pivot).
//Elements below index p are less than elements above index p.
//The function returns the pivot p
int pivot(int first, int last, string appNames[]);
//Implements the QuickSort algorithm to sort string array
//appNames between indeces first and last
void quickSort(int first, int last, string appNames[]);
void main()
{
string appNames[] =
{
"4) Pages", "2) Keynote", "3) Numbers",
"8) Word", "5) PowerPoint", "1) Excel",
"0) Documents", "6) Presentation", "7) Sheets"
};
displayAllApplicationNames(appNames, 9);
swapAppNames(3, 6, appNames);
displayAllApplicationNames(appNames, 9);
quickSort(0, 8, appNames);
displayAllApplicationNames(appNames, 9);
getchar();
}
void displayAllApplicationNames(string appNames[], int appCount)
{
for(appCount = 0; appCount <= 8; appCount++)
{
cout << "[" << appCount << "]\t"<< appNames[appCount] << endl;
}
if( appCount < 0 || appCount > 8)
{
cout << "_________" <<endl;
}
}
void swapAppNames(int appIndex1, int appIndex2, string appNames[])
{
string temp = appNames[appIndex1];
appNames[appIndex1] = appNames[appIndex2];
appNames[appIndex2] = temp;
}
int pivot(int first, int last, string appNames[])
{
int pivotIndex, mid = (first + last) / 2;
swapAppNames(first, mid, appNames);
pivotIndex = first;
string pivotValue = appNames[first];
for (int i = first + 1; i <= last; i++)
{
if (appNames[i] < pivotValue)
{
pivotIndex++;
swapAppNames(pivotIndex, i, appNames);
}
swapAppNames(first, last, appNames);
return pivotIndex;
}
}
void quickSort(int first, int last, string appNames[])
{
if (first < last)
{
int p = pivot( first, last, appNames);
quickSort( first, p - 1, appNames);
quickSort( p + 1, last, appNames);
}
}
我的目标是对字符串数组中的名称进行排序&#34; appNames&#34;。我在名称中添加了数字以显示他们应该在哪个顺序,但是当我运行程序时,它似乎根本没有正确排序。谁能告诉我哪里出错?
我一直在看这几天无济于事。
编辑:这是解决方案。非常感谢所有回复的人。不得不交换一些变量的位置并阅读快速排序算法。
int pivot(int first, int last, string appNames[])
{
int pivotIndex, mid = (first + last) / 2;
swapAppNames(first, mid, appNames);
pivotIndex = first;
string pivotValue = appNames[first];
for (int i = first + 1; i <= last; i++)
{
if (appNames[i] < pivotValue)
{
pivotIndex++;
swapAppNames(pivotIndex, i, appNames);
}
}
swapAppNames(pivotIndex, first, appNames);
return pivotIndex;
}
答案 0 :(得分:0)
您发布的代码仍然不正确。这是一个工作版本。我做了一些改变。
我从您的枢轴功能中删除了mid
启发式。除非你的任务明确要求你考虑最坏的情况,否则这是噪音。如果确实如此,则可以使用更好的启发式方法。我还改变了交换方式,使其效率降低,但希望更直观。
另一个变化是last
的含义,因为它在您的quickSort
和pivot
界面中使用。如果last
表示&#34;一个超过结束&#34;则更好。如果last
实际上是最后一项,那么您无法表示空列表。在您的符号(0,0)中长度为1,(0,1)的长度为2等,长度计算为(最后 - 第一个)+ 1.如果last
是&#34;一个过去结束&#34;,然后空列表是(0,0),(0,1)长度为1等,长度是简单的(最后 - 第一个)。如果你继续使用C ++,你会发现这就是STL的工作方式,所以现在学习它很有用。
#include <iostream>
#include <string>
using namespace std;
//Iterates over the string array appNames displaying each application
//name in a separate line. There are appCount elements in the array
void displayAllApplicationNames(string appNames[], int appCount);
//Swaps strings in string array appNames between appIndex1 and appIndex2
void swapAppNames(int appIndex1, int appIndex2, string appNames[]);
//Splits string array appNames around a pivot index p (the pivot).
//Elements below index p are less than elements above index p.
//The function returns the pivot p
int pivot(int first, int last, string appNames[]);
//Implements the QuickSort algorithm to sort string array
//appNames between indices first and last
void quickSort(int first, int last, string appNames[]);
int main() {
string appNames[] = {
"4) Pages", "2) Keynote", "3) Numbers",
"8) Word", "5) PowerPoint", "1) Excel",
"0) Documents", "6) Presentation", "7) Sheets" };
displayAllApplicationNames(appNames, 9);
swapAppNames(3, 6, appNames);
displayAllApplicationNames(appNames, 9);
quickSort(0, 9, appNames);
displayAllApplicationNames(appNames, 9);
return 0; }
void displayAllApplicationNames(string appNames[], int appCount) {
for (int i = 0; i < appCount; ++i) {
cout << "[" << i << "]\t" << appNames[i] << endl; }
cout << "_________" << endl; }
void swapAppNames(int appIndex1, int appIndex2, string appNames[]) {
string temp = appNames[appIndex1];
appNames[appIndex1] = appNames[appIndex2];
appNames[appIndex2] = temp; }
int pivot(int p, int n, string a[]) {
for (int i = p + 1; i < n; ++i) {
if (a[i] < a[p]) {
swapAppNames(i, p + 1, a);
swapAppNames(p, p + 1, a);
++p; } }
return p; }
void quickSort(int first, int last, string a[]) {
if (first < last) {
int p = pivot(first, last, a);
quickSort(first, p, a);
quickSort(p + 1, last, a); } }