在C函数中对数组进行排序

时间:2013-04-11 17:47:53

标签: c arrays pointers

所以我需要将数组传递给函数sort并对它进行排序,它在外面工作但不能让它在函数内部工作。需要传递指针只是不确定如何。

#include <stdio.h>

void sort(int *number, int n) {

    /* Sort the given array number, of length n */
    int temp = 0, j, i;

    for (i = 1; i < n; i++) {
        for (j = 0; j < n - i; j++) {
            if (number[j] > number[j + 1]) {
                temp = number[j];
                number[j] = number[j + 1];
                number[j + 1] = temp;
            }
        }
    }
}

int main() {
    int n = 20;
    int *ptr = malloc(n * sizeof *ptr);
    int i = 0;

    while (i < n) {
        ptr[i] = rand() % 100;
        i++;
    }
    int j = 0;
    while (j < n) {
        printf("%d , ", ptr[j]);
        j++;
    }
    void sort(ptr, n);
    printf("\n");

    int x = 0;
    while (x < n) {
        printf("%d , ", ptr[x]);
        x++;
    }
}

3 个答案:

答案 0 :(得分:5)

void sort(ptr, n);应为sort(ptr, n);

我可能错了,但我相信C编译器,第一种形式被解释为函数原型,第二种形式被解释为实际的函数调用。

答案 1 :(得分:1)

首先,当我编译时,我得到两个编译器警告。永远不要忽略编译器警告。实际上,在这种情况下,编译器警告之一恰好发生在代码中被破坏的行上。通常使用-Wall进行编译。

接下来,在调试器中运行它。例如,使用-g进行编译并使用gdb。你可以谷歌一个备忘单,了解如何轻松地开始使用gdb。在程序中逐行观察正在发生的事情,您将知道错误是什么。在这种特殊情况下,您会发现跳过调用函数的行。这条线已经被报告了一个警告,所以如果它的功能出乎意料的话应该不足为奇。

答案 2 :(得分:0)

这段代码使用指针对数组进行排序。希望它有所帮助

//@author Abdul-Razak Adam

#include <stdio.h>
#include <stdlib.h>


void fillArray(int * array, int size);
void printArrayValue(int * array, int size);
int getIndexOfMin(int * array, int size);
void removeAnIndexFromArray(int* array, int size, int index);
int* sortArray(int* array, int size);


//test
int main (void){

    int* SIZE; //size
    int * array;

    SIZE = (int*) malloc(sizeof(int));
    scanf("%d", SIZE);
    //printf("%i\n", *SIZE);
    int size = *SIZE;
    array = (int*) malloc (size * sizeof(int));

    fillArray(array,size);
    printArrayValue(array,size);


    printf("..............................................\n");
    printf("Array Sorted\n");
    printf("..............................................\n");
    array = sortArray(array,size); //get pointer to sorted array
    printArrayValue(array,*SIZE);

    //free memory
    free(array);
    free(SIZE);

}


//fill array with random values

void fillArray(int* array, int size){
    int i = 0;
    for (i = 0; i < size; i++){
        *(array + i) = rand()%100;
    }
}


//print value from array

void printArrayValue(int* array, int size){
    int i = 0;
    for (i = 0; i < size; i++){
        printf("%i , ", *(array+i));
    }
    printf("\n");
}


//sort value of array

int* sortArray(int* array, int size){
    int min  = *array;
    int originalSize = size;
    int * temp; 
    temp = (int* )malloc(sizeof(int) * size);
    int i = 0;
    int index;
    while(size > 0){
        index = getIndexOfMin(array,size);
        temp[i++] = array[index];
        removeAnIndexFromArray(array, size --,index);
    }
    return temp;

}

//get the index of the minimum value in the array

int getIndexOfMin(int * array, int size){
    int min = *array;
    int i = 0 ; 
    int index = 0;
    for (i = 0 ; i < size; i++){
        if (min > *(array+i)){
            min = *(array+i);
            index = i;
        }
    }
    return index;
}

//remove the minimum value from the array

void removeAnIndexFromArray(int* array, int size, int index){
    *(array + index) = 0;
    if (index != (size-1)){
        int i = index;
        for (i = index; i < (size -1); i++){
            *(array + i) = *(array + (i+1));
        }
    }
}