Как поменять значения в адресах в C - PullRequest
0 голосов
/ 18 января 2019

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

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

#define N 5

void swap(int *first, int *second)
{
    int *ptr;
    ptr = first;
    *first = *second;
    *second = *ptr;
}

void bubble(int A[], int length) {
  int n; /* The number of algorithm passes */
  int a;
  int b;
  int *ptr;
  n = length - 1;
  for (a=0; a<=n; a++) {
    for (b=n; b>a; b--) {
        if(A[b-1]>A[b])
        {
        swap(&A[b-1], &A[b]);
        }
    }
  }
}

void print_int_array(int a[], int length) {
  int i;

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

int main(void) {
  int i;
  int data[N];

  /* Create random data */
  for (i=0; i<N; i++) {
    data[i] = (int) ((rand()+0.5)/(double) RAND_MAX * 999);
  }

  print_int_array(data,N); /* Print original random dataset */

  bubble(data,N);
  printf("Data is now sorted:\n"); /* Print sorted data */

  print_int_array(data,N);

  return 0;
}

Я понимаю, что функция подкачки должна иметь это вместо:

void swap(int *first,int *second)
{
    int temp = *first;
    *first = *second;
    *second = temp;
}

Но как это отличается от первоначальной функции подкачки, которую я создал?

Когда я запускаю код с исходным кодом, я получаю результат:

a[0]=  1, a[1]=563, a[2]=193, a[3]=807, a[4]=584, a[5]=479,

Data is now sorted:
a[0]=  1, a[1]=193, a[2]=193, a[3]=479, a[4]=479, a[5]=479,

Второй массив, похоже, не показывает, что он отсортирован. Проблема возникает в функции подкачки, и по некоторым причинам последние несколько элементов имеют одинаковое значение и не были поменяны местами.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Причина в том, что когда вы изменяете *first, это также меняет *ptr.

void swap(int *first, int *second)
{
    int *ptr; // say that *first is 2 and *second is 1
    ptr = first; // ptr points to the same memory as first
    *first = *second; // now *first and *ptr is 1
    *second = *ptr; // *second doesn't change as intended, and is still 1
}
0 голосов
/ 18 января 2019

В исходной функции свопинга вы перезаписываете данные, на которые указывает first.Сохранение указателя в другой переменной не сохраняет исходные данные в любом месте.Поэтому, когда вы делаете

*second = *ptr;

ptr указывает на ту же память, на которую указывает first, то это ничем не отличается от

*second = *first;

, поскольку вы уже скопировали из *second в *first в предыдущей строке, вы просто копируете это обратно в *second.В конечном итоге оба местоположения содержат то, что изначально содержалось в *second*.

...