Quicksort算法无法正常运行

时间:2014-07-14 00:45:35

标签: c++ quicksort

#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;

}

1 个答案:

答案 0 :(得分:0)

您发布的代码仍然不正确。这是一个工作版本。我做了一些改变。

我从您的枢轴功能中删除了mid启发式。除非你的任务明确要求你考虑最坏的情况,否则这是噪音。如果确实如此,则可以使用更好的启发式方法。我还改变了交换方式,使其效率降低,但希望更直观。

另一个变化是last的含义,因为它在您的quickSortpivot界面中使用。如果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); } }