2016-03-25 3 views
1

Учитывая массив, я должен сортировать его таким образом, чтобы первым элементом было наименьшее значение, второй - самый большой, третий - второй наименьший элемент и скоро.Сортировка массива с альтернативными наименьшими наибольшими значениями

Но мой код просто печатает исходный массив, и я не могу понять, почему. Любой совет будет принят во внимание.

#include <stdio.h> 
void swap(int m, int n); 
int main() 
{ 
    int i,j,A[10],n; 

    printf ("enter the number of array elements\n"); 
    scanf ("%d", &n); 

    for (i=0;i<n;i++){ 
     scanf ("%d", &A[i]); 
    } 


    for (i=0;i<n;i++){ 

     if (i%2 == 0){ 
      for (j=i;j<n;j++){ 
       if (A[j] < A[i]){ 
        swap(A[i],A[j]); 
       } 
      } 
     } 
     else if (i%2 != 0){ 
      for (j=i;j<n;j++){ 
       if (A[j] > A[i]){ 
        swap (A[i],A[j]); 
       } 
      } 
     } 

    } 

    for(i=0;i<n;i++){ 
     printf ("%d\n", A[i]); 
    } 
    return 0; 
} 

void swap(int m, int n) 
{ 
    int temp; 
    temp = m; 
    m = n; 
    n = temp; 
} 
+0

Если вы хотите встроенный обмен на месте, попробуйте следующее: 'A [i]^= A [j]^= A [i];' И вообще исключить функцию свопинга. Вы также можете использовать макрос для этой цели. – Quirk

+0

'void swap (int A [], int i, int j);' также будет работать. Вызов с 'swap (A, i, j)'. – user3386109

+1

@Quirk: Плохой совет. Использование функции для swap делает код более удобочитаемым, а xor-цепочка также менее интуитивно понятна и не дает каких-либо преимуществ в современном коде и, вероятно, менее эффективна с плохо оптимизирующим компилятором. – Olaf

ответ

1

Вам необходимо передать ссылку с помощью указателей.

void swap(int *m, int *n) 
{ 
    int temp; 
    temp = *m; 
    *m = *n; 
    *n = temp; 
} 

и изменить свой код, чтобы назвать это как этот

swap (&A[i],&A[j]); 

Для решения, которое не использует указатели вы можете использовать MACRO подобное;

#define swap(x,y) do{int t=(x);(x)=(y);(y)=t;}while(0); 

swap(A[i],A[j]); 

Просто определите это в верхней части файла и удалите функцию подкачки и прототип. Все дело в области, потому что MACRO - это просто текст, который заменяет его в правильной области, чтобы использовать A [i].

+0

Можно ли решить эту проблему без указателей? – user34304

+0

Я спрашиваю, потому что курс программирования в моем колледже еще не накрыт указателями. – user34304

+0

@ user34304 Передача по значению ограничит вас проблемами с охватом. Вам нужно будет использовать ссылки указателя. – Quirk

0

Первой проблемой, которую я заметил в вашей программе, является ваша функция подкачки. В вашей функции свопинга ваши параметры являются примитивными типами данных. Таким образом, функция создает копии целых чисел «m» и «n» и переключает значения в пределах сфера действия функции swap. Но как только функция вернется, вы ничего не поменяли. Чтобы поменять значения в массиве, который вы создали в основном, вам нужно выполнить проход по ссылке (передать указатели на переменную, которую вы пытаетесь поменять). Измените функцию подкачки так:

void swap(int *m, int *n) 
{ 
    int temp; 
    temp = *m; 
    *m = *n; 
    *n = temp; 
} 

Тогда внутри ваш главный, передать в адрес этого значения в массиве с помощью & оператора (адрес в). Вот пример: swap (&A[i],&A[j]);

Другие предложения:

  1. Формат ваш код, так что пространство между вашими условиями в вашей для петель.
  2. Добавить комментарий.
Смежные вопросы