代码之家  ›  专栏  ›  技术社区  ›  Brett

按字母顺序排序C++

  •  -3
  • Brett  · 技术社区  · 7 年前

    #include <iostream>
    #include <string>
    #include <string.h>
    #include <conio.h>
    using namespace std;
    
    
    int main() {
        const int SIZE = 20;
    char temp;
    int i, j;
    bool madeAswap;
    char arr[SIZE][SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
        "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
        "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
        "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
        "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
    do {
        madeAswap = false;
        for (i = 1; i < SIZE; i++)
        {
            for (j = 1; j < SIZE; j++)
            {
                if (strcmp(arr[j - 1], arr[j]) > 0)
                {
                    temp = arr[i][i];
                    arr[i][i] = arr[i + 1][i + 1];
                    arr[i + 1][i + 1] = temp;
                    madeAswap = true;
                }
            }
        }
        }while (madeAswap);
    for (int j = 0; j < SIZE; j++) {
        cout << arr[j][j] << endl;
    }
    system("pause");
    return 0;
    

    }

    2 回复  |  直到 7 年前
        1
  •  0
  •   JaMiT    7 年前

    首先,这不是任何排序算法,而是接近冒泡排序,一种耗时的算法。同样,您是以随机方式处理字符,而不是字符串。

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        const int SIZE = 20;
        string temp;
        int i, j;
        string arr[SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
            "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
            "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
            "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
            "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
        for (i = 1; i < SIZE; i++)
        {
            for (j = 1; j < SIZE; j++)
            {
                if ( arr[j-1] > arr[j])
                {
                   temp = arr[j-1];
                   arr[j-1] = arr[j];
                   arr[j] = temp;
                }
            }
        }
        for (int j = 0; j < SIZE; j++) {
            cout << arr[j] << endl;
        }
        system("pause");
        return 0;
    }
    
        2
  •  0
  •   hleme    7 年前

    您说过您需要使用“选择排序”,但您使用的是“冒泡排序”。我在两个循环(for)和字符串交换(movement)上修改了您的程序。

    #include <iostream>
    #include <string>
    #include <string.h>
    using namespace std;
    
    int main() {
        const int SIZE = 20;
        string temp;
        int i, j;
        string arr[SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
            "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
            "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
            "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
            "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
        for (i = 0; i < (SIZE - 1); i++)
        {
            for (j = (i+1); j < SIZE; j++)
            {
                if ( arr[i] > arr[j])
                {
                   temp = arr[i];
                   arr[i] = arr[j];
                   arr[j] = temp;
                }
            }
        }
        for (int j = 0; j < SIZE; j++) {
            cout << arr[j] << endl;
        }
        system("pause");
        return 0;
    }
    

    真正的“选择排序”具有比较的复杂性O(n^2)和移动的复杂性O(n)。我认为正确的实施方式应该是:

    #include <iostream>
    #include <string>
    #include <string.h>
    using namespace std;
    
    int main() {
        const int SIZE = 20;
        string temp;
        int i, j;
        string arr[SIZE] = { "Collins, Bill", "Smith, Bart", "Michalski, Joe",
            "Griffin, Jim","Sanchez, Manny", "Rubin, Sarah", "Taylor, Tyrone",
            "Johnson, Jill","Allison, Jeff", "Moreno, Juan", "Wolfe, Bill",
            "Whitman, Jean","Moretti, Bella", "Wu, Hong", "Patel, Renee",
            "Harrison, Rose","Smith, Cathy", "Conroy, Pat", "Kelly, Sean", "Holland, Beth" };
        for (i = 0; i < (SIZE - 1); i++)
        {
            int k = i;
            for (j = (i+1); j < SIZE; j++)
            {
                if ( arr[k] > arr[j])
                {
                   k = j;
                }
            }
            if (i != k) {
                temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
        }
        for (int j = 0; j < SIZE; j++) {
            cout << arr[j] << endl;
        }
        system("pause");
        return 0;
    }
    

    解释代码:String是一个包含字符数组的C++类。语句“string arr[SIZE]”是大小为的字符串数组。您可以在' http://www.cplusplus.com/reference/string/string/ '.

    代码中的另一个问题是关于排序。“选择排序”通过比较元素和后续元素对列表进行排序,因此您的第二个循环是错误的,它应该是:'for(j=(i+1);j<大小;j++)。