簡體   English   中英

C ++ quicksort實現崩潰; 還樣式建議

[英]C++ quicksort implementation crashes; also style advices

我是一個新手,今天在C ++中實現了我的第一個quicksort算法:)它可以工作,但僅適用於少數幾個,當我嘗試輸入20多個(或大數字)時,它崩潰了,但我沒有知道為什么。 它寫得這么差嗎?

也可以隨時批評我的代碼! 有更好的方法嗎? 例如,我如何實現用戶可以輸入數字,直到他鍵入一個特定的單詞?

謝謝!! :)

#include <iostream>
using namespace std;

//SORTING FUNCTION
void sort(double* numbers, int end, int start = 0)
{
    //END THE RECURSION
    if ((end-start) <= 0)
    {
        return;
    }

    //SORTING PART
    else
    {
        int pivot = (start + end) / 2;
        int left = pivot - 1;
        int right = pivot + 1;

        //SORT ALL THE NUMBERS RIGHT OF THE PIVOT
        do
        {
            if (numbers[left] >= numbers[pivot])
            {
                double temp;
                temp = numbers[left];
                for (int i = left; i < pivot; i++)
                {
                    numbers[i] = numbers[i + 1];
                }
                numbers[pivot] = temp;
                pivot--;
                left--;
            }
            else if (numbers[left] < numbers[pivot])
            {
                left--;
            }
        } while (left >= start);

        //SORT ALL THE NUMBERS RIGHT OF THE PIVOT
        do
        {
            if (numbers[right] <= numbers[pivot])
            {
                double temp;
                temp = numbers[right];
                for (int i = right; i > pivot; i--)
                {
                    numbers[i] = numbers[i - 1];
                }
                numbers[pivot] = temp;
                pivot++;
                right++;
            }
            else if (numbers[right] > numbers[pivot])
            {
                right++;
            }
        } while (right <= end);

        //SPLIT THE ARRAY INTO TO SUB ARRAYS AND CALL THE SORT FUNCTION
        sort(numbers, pivot - 1); //LEFT SIDE OF THE PIVOT
        sort(numbers, end, pivot + 1); //RIGHT SIDE OF THE PIVOT
}

int main()
{
    //IMPUT NUMBERS
    cout << "IMPUT NUMBERS. END WITH CHARACTER." << endl << endl;
    double numbersTemp[100];
    int counter = -1; //-1 SO IT POINTS TO THE RIGHT INDEX
    for (int i = 0; i < 100; i++)
    {
        double temp;
        cin >> temp;
        if (cin)
        {
            numbersTemp[i] = temp;
            counter++;
        }
        else
        {
            break; //BREAK WHEN SOMETHING ELSE THAN A DOUBLE IS ENTERED
        }
    }

    //INITIALISE ARRAY IN RIGHT SIZE
    double* numbers = new double[counter + 1];

    //PASS THE VALUES TO THE NEW ARRAY
    for (int i = 0; i < counter + 1; i++)
    {
        numbers[i] = numbersTemp[i];
    }

    //SORT IT
    sort(numbers, counter);

    //GIVE OUT THE SORTET NUMBERS
    cout << endl << "SORTED NUMBERS: " << endl;
    for (int k = 0; k <= counter; k++)
    {
        cout << numbers[k] << " ";
    }
    cout << endl << endl;

    //CLEAR USED MEMORY SPACE
    delete[] numbers;

    //END PROGRAMM (DUH)
    return 0;
}

我重新整理了您的排序代碼,使其更有效率

//END THE RECURSION
if ((end - start) <= 0)
{
    return;
}

//SORTING PART
else
{
    int pivot = (start + end) / 2;
    int left = start;   // Set left to first element
    int right = end;    // Set right to last element

    while (left < right)
    {
        if (numbers[left] > numbers[pivot]) // If left is greater then pivot swap them
        {
            double temp = numbers[left];
            numbers[left] = numbers[pivot];
            numbers[pivot] = temp;

            pivot = left; // Pivot is now left
        }

        if (numbers[right] < numbers[pivot]) // If right is smaller then pivot
        {
            double temp = numbers[right];
            numbers[right] = numbers[pivot];
            numbers[pivot] = temp;

            pivot = right; // Pivot is now right
        }

        left++;
        right--;
    }

    //SPLIT THE ARRAY INTO TO SUB ARRAYS AND CALL THE SORT FUNCTION
    sort(numbers, pivot - 1); //LEFT SIDE OF THE PIVOT
    sort(numbers, end, pivot + 1); //RIGHT SIDE OF THE PIVOT
}

左和右從數組的結尾而不是從中間移動。 這樣,將對數組的左部分和右部分進行排序,並且僅需要樞軸移動即可。 如果您想了解它的工作原理,則基於此視頻

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM