невозможно правильно передать массив в быстрой сортировке - PullRequest
1 голос
/ 21 июня 2011

Вот моя программа, она компилируется и работает без синтаксических ошибок. Однако когда она не сортирует массив. Проблема заключается в том, где я передаю массив в функции

#include<stdio.h>
#include<string.h>
int partition (int *,int,int);
void quicksort (int *,int,int);
static int call=0;
int main()
{
int i,j,choice;
int length;
int a[]={81, 12, 90, 3, 49, 108, 47};
i=0;

length=sizeof(a)/sizeof(a[0]);
quicksort(a,0,length-1);
printf("the sorted array is\n");
for(i=0;i<length;i++)
 printf (" %d ",a[i]);
}
int partition(int *num,int p,int r)
{
 int x,j,i,temp,bak;
  x=num[r];
  i=p-1;
       for(j=0;j<=r-1;j++)
  { 
         if(num[j]<=x)
     {
      i=i+1;
       temp=num[i];
       num[i]=num[j];
       num[j]=temp;


      {
       printf(" %d",num[bak]);
        }

     }  
  }
  num[i+1]=num[r];

 return i+1;
}

void quicksort (int *num,int p,int r)
{ 
 int q;
 if (p<r)
  {
    call++;

    q=partition(num,p,r);
        quicksort(num,p,q-1);
        quicksort(num,q+1,r);
  }
}    

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

Внутри функционального раздела, когда происходит перестановка, я попытался напечатать там сам массив (это не отсортированный массив, а просто для того, чтобы увидеть, к чему это привело), ​​затем я увидел, что только 2 или 3 элемента массива, которые я передал, печатается и остальная часть массива теряется где-то. Так что я сомневаюсь, что массив не передается должным образом.

Чтобы увидеть, какова проблема с передачей массива в функцию, я написал небольшую программу ka1.c

#include<stdio.h>
void pass(int *);
int main ()
{
int a[]={3,5,61,32,12};
pass(a);
}
void pass (int *num)
{
int i,j;
 j=sizeof(num)/sizeof(num[0]);
 for (i=0;i<j;i++)
 printf(" %d",num[i]);
}

Теперь, когда я запускаю приведенный выше код, я получаю вывод только

 3 5

Я ожидал, что будет напечатан весь массив при выводе ka1.c. Где, как будто вы заметили, что остальная часть массива не печатается. Куда это делось? Я использовал ту же логику в быстрой сортировке, поэтому я чувствую, что ошибка одинакова в обоих случаях.

Update1
После комментария ниже я проверил длину массива, полученного в функции разделения quicsort.c, с помощью

sizeof(num)/sizeof(num[0]);

и найден исходный массив

int a[]={81, 12, 90, 3, 49, 108, 47};

который имеет длину 7 здесь, когда я передал его в раздел функции длина всего 2. То же самое относится и к программе ka1.c. Так почему в обоих случаях только длина равна 2?

UPDATE2
Как предложения, приведенные ниже, я передал длину также

#include<stdio.h>
#include<string.h>
int partition (int *,int,int,int);
void quicksort (int *,int,int,int);
static int call=0;
int main()
{
int i,j,choice;
int length;
int a[]={81, 12, 90, 3, 49, 108, 47};
i=0;
printf("the sorted array is\n");
length=sizeof(a)/sizeof(a[0]);
printf("length of array %d\n",length);
printf("quick sort called in main\n");
quicksort(a,0,length-1,length);
for(i=0;i<length;i++)
 printf (" %d ",a[i]);
}
int partition(int *num,int p,int r,int june)
{
 int x,j,i,temp,bak,length;
  x=num[r];
  i=p-1;
  bak=0;
  printf("inside the partition\n");
 printf("length of june recieved =%d \n",june);
  for(j=0;j<=r-1;j++)
  { 
    if(num[j]<=x)
     {
      i=i+1;
       temp=num[i];
       num[i]=num[j];
       num[j]=temp;
    printf("printing array after swap\n");
      for(;bak<7;bak++)
      {
           printf(" %d ",num[bak]);
          }
     }  
  }
  num[i+1]=num[r];

 return i+1;
}

void quicksort (int *num,int p,int r,int june)
{ 
 int q,bbc,ccd;
 if (p<r)
  {
    call++;
         printf("partition called  %d times p=%d r=%d\n",call,p,r);
    printf("before sending to function length of june=%d \n",june);
    q=partition(num,p,r,june);
    bbc=q-1-p+1;
        quicksort(num,p,q-1,bbc);
        ccd=r-q-1+1;
        quicksort(num,q+1,r,ccd);
  }
}

Но программе все еще не удается распечатать отсортированный массив. Вы можете скомпилировать и запустить приведенный выше код.

решаемые
Наконец, с помощью ответов ниже я смог решить вышеупомянутую проблему. Ошибка заключалась в разделении функции в операторе

  for (j = 0; j <= r - 1; j++)

вместо этого должно было быть

  for (j = p; j <= r - 1; j++)

примечание j=p и j=0 здесь

j = 0

неверно, так как при попытке рекурсивно отсортировать второй раздел он начал нарушать первый раздел, и, следовательно, результат также был неверным.

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

ТАК правильный код

#include<stdio.h>
#include<string.h>
int partition (int *, int, int, int);
void quicksort (int *, int, int, int);
static int call = 0;
int
main ()
{
  int i, j, choice;
  int length;
  int a[] = { 81, 12, 90, 3, 49, 108, 47 };
  i = 0;
  printf ("the sorted array is\n");
  length = sizeof (a) / sizeof (a[0]);
  printf ("length of array %d\n", length);
  printf ("quick sort called in main\n");
  quicksort (a, 0, length - 1, length);
  for (i = 0; i < length; i++)
    printf (" %d ", a[i]);
}

int
partition (int *num, int p, int r, int june)
{
  int x, j, i, temp, bak, length;
  x = num[r];
  i = p - 1;
  bak = 0;
  for (j = p; j <= r - 1; j++)
    {
      if (num[j] <= x)
    {
      i = i + 1;
      temp = num[i];
      num[i] = num[j];
      num[j] = temp;
    }
    }
  temp=num[i+1];
  num[i + 1] = num[r];
  num[r]=temp;
  return i + 1;
}

void
quicksort (int *num, int p, int r, int june)
{
  int q, bbc, ccd;
  if (p < r)
    {
      call++;
      q = partition (num, p, r, june);
      bbc = q - 1 - p + 1;
      quicksort (num, p, q - 1, bbc);
     ccd=r-q+1;
      quicksort (num, q + 1, r, ccd);
    }
}

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Проблема в том, как вы вычисляете длину массива ....... попробуйте просто указать количество элементов в массиве в качестве параметра для метода быстрой сортировки .... Я думаю, у вас будетправильный ответ ... а также я согласен с поставленной точкой .... попробуйте передать длину массива с массивом ..... попробуйте оба и скажите мне, что работает ... :) НОВЫЙ КОД:

#include<stdio.h>
#include<string.h>
//int partition (int *,int,int);
void q_sort(int*,int,int);
void quicksort (int *,int);
static int call=0;
int main()
{
int i,j,choice;
int length;
int a[]={81, 12, 90, 3, 49, 108, 47};
i=0;
printf("the sorted array is\n");
length=sizeof(a)/sizeof(a[0]);
printf("length of array %d\n",length);
printf("quick sort called in main\n");
quicksort(a,length);
for(i=0;i<length;i++)
 printf (" %d ",a[i]);
}
/*int partition(int *num,int p,int r)
{
 int x,j,i,temp,bak,length;
  x=num[r];
  i=-1;
  bak=0;
  printf("inside the partition\n");
  for(j=0;j<=r-1;j++)
  {
    if(num[j]<=x)
     {
      i=i+1;
       temp=num[i];
       num[i]=num[j];
       num[j]=temp;
    printf("printing array after swap\n");
      for(;bak<7;bak++)
      {
           printf(" %d ",num[bak]);
          }
     }
  }
  num[i+1]=num[r];

 return i+1;
}
*/
/*void quicksort (int *num,int p,int r)
{
 int q,bbc,ccd;
 if (p<r)
  {
    call++;
         printf("partition called  %d times p=%d r=%d\n",call,p,r);
    q=partition(num,p,r);
    bbc=q-1-p+1;
        quicksort(num,p,q-1);
        ccd=r-q-1+1;
        quicksort(num,q+1,r);
  }
}*/
void quicksort(int numbers[], int array_size)
{
  q_sort(numbers, 0, array_size - 1);
}


void q_sort(int numbers[], int left, int right)
{
  int pivot, l_hold, r_hold;

  l_hold = left;
  r_hold = right;
  pivot = numbers[left];
  while (left < right)
  {
    while ((numbers[right] >= pivot) && (left < right))
      right--;
    if (left != right)
    {
      numbers[left] = numbers[right];
      left++;
    }
    while ((numbers[left] <= pivot) && (left < right))
      left++;
    if (left != right)
    {
      numbers[right] = numbers[left];
      right--;
    }
  }
  numbers[left] = pivot;
  pivot = left;
  left = l_hold;
  right = r_hold;
  if (left < pivot)
    q_sort(numbers, left, pivot-1);
  if (right > pivot)
    q_sort(numbers, pivot+1, right);
}
1 голос
/ 21 июня 2011

Вы должны передать размер массива вместе с самим массивом.Функция, получающая массив, не может определить его размер.Принимающая функция видит в качестве указателя только num, поэтому при использовании sizeof(num) она возвращает размер указателя num, а не размер памяти, выделенной для массива в функции main.Итак, вы должны сделать что-то вроде этого:

#include<stdio.h>

void pass(int *, int);
int main ()
{
    int a[]={3,5,61,32,12};
    int length;
    length = sizeof(a)/sizeof(a[0]);
    pass(a, length);
}
void pass (int *num, int size)
{
    int i;  
    for (i=0;i<size;i++)
        printf(" %d",num[i]);
}

Этот пост более подробно объясняет похожую проблему: Передача массива в качестве аргумента в C ++

1 голос
/ 21 июня 2011

Вам нужно поставить ; в конце объявления функции перед main:

void pass(int *) ;
                 ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...