Как правильно отсортировать массив с помощью вставки сортировки? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть целая программа, и она работает, но не правильно.Функция printArray печатает только первый элемент массива и, похоже, не сортирует элементы.Я не знаю, как с этим справиться.

int main(){
    int number;
    printf( "Give a number of elements:" );
    scanf("%d",&number);
    printf("Array to sort:");
    int* Array = createArray(number);
    int sizeArr = sizeof(Array)/sizeof(Array[0]);
    int *sortedArr = insertionSort(Array,sizeArr);
    puts("");
    printf("Sorted array by Insertion Sort:");
    printArr(sortedArr,sizeArr);
    getch();
    return 0;
}
int* createArray(int number){
    int *arr =(int*) malloc(sizeof(int*)*number);
    srand((unsigned)time(NULL));
    for(int i=0;i<number;i++){
        arr[i] = 1 + rand()%10;
        printf("%d",arr[i]);
    }
    return arr;
}
int *insertionSort(int *arr,int sizeArr){
    int i, j,repArr;
    for(i=1;i<sizeArr;i++){
            repArr = arr[i];
            j=i-1;
    while(j>=0 && arr[j]>repArr){
        arr[j+1] = arr[j];
        j = j - 1;
    }
        arr[j+1] = repArr;
    }
return arr;
}

void printArr(int*arr,int sizeArr){
    for(int i=0;i<sizeArr;i++){
        printf("%d",arr[i]);
        }
       puts("");
}

1 Ответ

1 голос
/ 02 мая 2019

tl; dr: Вы обязаны знать, сколько элементов в распределении. Вы выделили 1 number элементов, поэтому размер равен number.

Эта строка не делает то, что вы думаете, что она делает. Он будет сравнивать размеры int и int *. На вашей платформе они одинакового размера.

int sizeArr = sizeof(Array)/sizeof(int);

Вы сообщаете всем своим функциям, что у вас есть массив из 1 элемента, поэтому вы сортируете этот 1 элемент и печатаете этот 1 элемент.

Вы уже знаете, сколько существует int (вы притворяетесь), это number.

Вместо того, чтобы интерпретировать результат malloc как набор int с (там нет int с, поэтому ваша программа не определена), вы можете использовать std::vector<int>, который имеет size член.

Вот более подход C ++

#include <iostream>
#include <random>
#include <vector>
#include <algorithm>

std::random_device rd;  //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()

std::vector<int> createNumbers(int number){
    std::vector<int> arr(number);
    std::uniform_int_distribution<> d10(1, 10);
    std::generate_n(begin(arr), number, [&](){ return d10(gen); });
    return arr;
}

template<class FwdIt, class Compare = std::less<>>
void insertionSort(FwdIt first, FwdIt last, Compare cmp = Compare{})
{
    for (auto it = first; it != last; ++it) {
        auto const insertion = std::upper_bound(first, it, *it, cmp);
        std::rotate(insertion, it, std::next(it)); 
    }
}

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec)
{
    for (auto& el : vec)
    {
        os << el << ' ';
    }
    return os;
}

int main(){
    int number;
    std::cout << "Give a number of elements:";
    std::cin >> number;
    auto Numbers = createNumbers(number);
    std::cout << "Array to sort:" << Numbers;
    insertionSort(begin(Numbers), end(Numbers));
    std::cout << "Sorted array by Insertion Sort:" << Numbers;
    return 0;
}

Вживую

1: игнорирование путаницы с int и int *, которые имеют одинаковый размер на вашей платформе. На других платформах у вас есть несколько элементов number.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...