2013-04-11 3 views
1

Так что мне нужно передать массив в сортировку функции и отсортировать ее, она работает снаружи, но не может заставить ее работать внутри функции. Нужно пройти в указателях, просто не знаете, как это сделать.Сортировка массива в функции C

#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++; 
    } 
} 
+2

внутри main(): 'void sort (ptr, n);' удалить пустоту или будет рассматриваться как объявление. – wildplasser

+0

Вы забыли указать значение семени [srand()] (http://www.cplusplus.com/reference/cstdlib/srand/) –

+0

Вы посмотрели qsort в stdlib? – danh

ответ

5

void sort(ptr, n); должно быть просто sort(ptr, n);

Я мог ошибаться, но я верю в C компилятором, первая форма интерпретируется как прототип функции, а второй фактический вызов функции.

+0

Вы правы: –

+0

+1 Совершенно верно: хотя большинство людей ставит прототипы наверху или в заголовках, можно поставить прототип функции (почти) в любом месте кода. – dasblinkenlight

+0

'Я верю в компилятор C ...' - Да, ключ зависит от компилятора. Есть некоторые, которые сделают это ошибкой и даже не скомпилируют ее. – Mike

1

Во-первых, когда я компилирую, я получаю два предупреждения о компиляторе. Никогда не игнорируйте предупреждения компилятора. На самом деле, в этом случае одно из предупреждений компилятора происходит именно по той строке в вашем сломанном коде. Обычно компилируются с -Wall.

Затем запустите это в отладчике. Скомпилируйте с помощью -g и используйте, например, gdb. Вы можете google чит-лист о том, как начать работу с gdb довольно легко. Следите за тем, что происходит по строкам вашей программы, и вы узнаете, что такое ошибка. В этом конкретном случае вы заметите, что строка, в которой вы вызываете свою функцию, пропускается. Эта строка уже сообщается с предупреждением, поэтому неудивительно, если она работает на удивление.

+0

Downvoter, объясните пожалуйста. – djechlin

+1

@EricPostpischil Скомпилирован в соответствии с gcc версии 4.6.3 и запущен. Выход: 'dan @ dev1: ~ $ ./a.out 83, 86, 77, 15, 93, 35, 86, 92, 49, 21, 62, 27, 90, 59, 63, 26, 40, 26 , 72, 36, 83, 86, 77, 15, 93, 35, 86, 92, 49, 21, 62, 27, 90, 59, 63, 26, 40, 26, 72, 36, ' – djechlin

+0

@EricPostpischil [** codepad **] (http://codepad.org/H82Grdgx) вывод этого кода и djechlin не ошибочен –

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)); 
     } 
    } 
} 
Смежные вопросы