Модификация счетной сортировки - PullRequest
1 голос
/ 11 июля 2019

Сортировка Count ниже сортирует элементы на основе их значения ASCII.Код ниже работает нормально, но я хочу сделать некоторые изменения ввода / вывода.Код не принимает пользовательский ввод.

Я пытался внести некоторые изменения, но получил неопределенное поведение.Мое первое сомнение - почему я получаю неопределенное поведение.во-вторых, пожалуйста, предоставьте мне код, который заставит приведенный ниже код работать как положеноЧасть комментариев - это то, что я попробовал сам. Я хочу, чтобы она принимала данные от пользователя.

#include<bits/stdc++.h>
#include<string.h>

using namespace std;

#define RANGE 255

void countSort(char arr[])      //void countSort(char arr[],int n)
{
    char output[strlen(arr)];   //char output[n];

    int count[RANGE + 1], i;
    memset(count, 0, sizeof(count));

    for(i = 0; arr[i]; i++) {
        count[arr[i]]++;
    }

    for (i = 1; i <= RANGE; ++i) {
        count[i] += count[i-1];
    }

    for (i = 0; arr[i]; ++i) {
        output[count[arr[i]]-1] = arr[i];
        --count[arr[i]];
    }

    for (i = 0; arr[i]; ++i) {
        arr[i] = output[i];
    }
}

// Driver code
int main()
{
    char arr[] = "geeksforgeeks";

    countSort(arr);

    cout<< "Sorted character array is "<<arr;

/*
    int n;
    cin>>n;
    char arr[n];

    for(int i=0;i<n;i++) {
        cin>>arr[i];
    }
    countSort(arr,n);

    for(int i=0;i<n;i++) {
        cout<<endl<<arr[i];
    }
*/
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Таким образом, ОП спросил, как получить ввод от пользователя и отсортировать его.И не предопределенная строка в данном массиве символов.

Я дам ответ.Но вопрос помечен с C ++, и я, кстати, преобразую его в C ++.

.Код в вопросе является копией один к одному из GeeksforGeeks и пытается закодировать так называемый алгоритм подсчета сортировки в C ++, который описан здесь .

Так каккод взят из GeeksforGeeks Мне, к сожалению, нужно обвинить пользователя "rathbhupendra" в действительно плохом коде C ++.Мне очень жаль

Код использует:

  • Массивы в стиле C
  • Массивы переменной длины (расширение компилятора. Не совместимо с C ++)
  • strlen
  • memset
  • #include<bits/stdc++.h> and #include<string.h>
  • с использованием пространства имен std
  • необычные условия завершения в циклах for for(i = 0; arr[i]; ++i)
  • массивы символов вместо std::string s
  • Макрос для определения размера массива (#define RANGE 255)

Итак, ничего C ++.

А теперь, ответ.

Вам нужно прочитать строку от пользователя в переменной типа std::string с помощью функции std::getline.

Std :: string можно использовать как массив символов.Без разницы.

Пожалуйста, смотрите решение C ++:

РЕДАКТИРОВАТЬ

Отредактировано по комментариям MichaelDorgan

#include <iostream>
#include <string>
#include <vector>

constexpr size_t AsciiRange = 256;

// Convert signed char to unsigned size_t type.
inline size_t char2sizet(char c) { return static_cast<size_t>(static_cast<unsigned char>(c)); }

void countSort(std::string& stringToSort)      
{
    std::vector<size_t> count(AsciiRange, 0U);

    size_t i { 0U };
    for (i = 0U; i < stringToSort.size(); i++) {
        count[char2sizet(stringToSort[i])]++;
    }

    for (i = 1U; i < AsciiRange; ++i) {
        count[i] += count[i - 1U];
    }

    std::string output(stringToSort);  
    for (i = 0U; i < stringToSort.size(); ++i) {
        output[count[char2sizet(stringToSort[i])] - 1U] = stringToSort[i];
        --count[char2sizet(stringToSort[i])];
    }

    stringToSort = output;
}

int main()
{
    std::cout << "\nPlease enter a string:\n\n";

    // Get the string from the user
    std::string inputString{};
    getline(std::cin, inputString);

    // Sort it by characters
    countSort(inputString);

    // Show result
    std::cout << "\n\n\nString sorted by characters is:\n\n" << inputString << '\n';

    return 0;
}

Надеждаэто помогает .,.

0 голосов
/ 11 июля 2019

Я понимаю, что «получаю неопределенное поведение», которое вы имели в виду ошибка сегментации , которая иногда возникала. Проблема заключается в этой строке

for(i = 0; arr[i]; i++)

вместо этого вы должны написать

for(i = 0; i < n; i++)

Вы можете проверить, что в первом случае в конце каждого цикла arr[i] равен иногда какой-то странный символ (этот символ не принадлежит входной строке) и count[arr[i]] для этого символа возвращает отрицательное число, которое вызывает ошибку сегментации здесь

output[count[arr[i]]-1] = arr[i];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...