如何使用插入排序对数组进行正确排序?

时间:2019-05-02 13:53:31

标签: c

我有整个程序,但可以正常运行。 printArray函数仅打印Array的第一个元素,并且似乎不对元素进行排序。 我不知道如何处理。

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 个答案:

答案 0 :(得分:1)

tl; dr:您有责任知道分配中有多少个元素。您分配了 1 number个元素,因此大小为number

此行不执行您认为的操作。它将比较intint *的大小。在您的平台上,它们的大小相同。

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

您正在告诉所有函数,您拥有一个由1个元素组成的数组,因此您对这1个元素进行了排序并打印了1个元素。

您已经知道存在int个正在伪装的number

您可以使用{{1},而不是将malloc的结果解释为一堆int(那里没有int,因此您的程序是未定义的)。 },其中有一个std::vector<int>成员。

这是一种更C ++的方法

size

See it live

1:忽略#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; } int的混淆,它们在您的平台上大小相同。在其他平台上,您有多个int *元素。