Почему этот выбор сортировки кода в Cpp, не давая требуемого вывода

#include<iostream>

using namespace std;
int min_arr(int arr[],int size);
void swap(int *,int *);
int main()
{
    int arr[10]={31,2,55,3,77,12,89,98,43,34},loc;
    int* arr1;
    arr1 = &arr[0];
    for(int i=0;i<10;i++)
    {
        for( int j=i;j<9;j++)
        {
            loc = min_arr(arr1,(10-i));
            swap(&arr[loc],&arr[i]);
            arr1++;
        }
    }   

    for(int i =0; i<10;i++)
        cout<<arr[i]<<endl;

    return 0;
}

int min_arr(int arr[],int size)
{
    int k=0;
    int temp=arr[0];
    for(int i=1;i<size;i++)
    {
        if(arr[i]<temp)
        {
            temp=arr[i];
            k=i;
        }   
    }

    return k;
}

void swap(int *a, int *b)
{
   int temp;
   temp=*a;
   *a=*b;
   *b=temp;
}  

Почему этот выбор сортировки кода в Cpp, не давая требуемого вывода? Пожалуйста, найдите недостаток! Я взял две функции, чтобы найти минимум под-массивов в процессе работы. И когда я нахожу min, я возвращаю его индекс и меняю первую позицию вложенного массива и элемента с минимальным значением!

3 ответа

Решение

После перестановки кода и добавления нескольких строк отладки довольно легко выяснить, что не так:

  • Во-первых, второй цикл (J цикл) совершенно бессмысленно
  • Во-вторых, переменная loc основана не на 0, а на i (как вы искали по arr1, который увеличивается с помощью цикла), поэтому arr [loc] должен быть arr [loc + i]

Исправленный, с умным отступом (это важно, чтобы код тура был легко читаемым):

#include<iostream>

#define ARRAY_SIZE 10
using namespace std;
int min_arr(int arr[],int size);
void swap(int *,int *);
int main()
{
    int arr[ARRAY_SIZE]={31,2,55,3,77,12,89,98,43,34},loc;
    int* arr1;
    arr1 = &arr[0];
    for( int i = 0; i < ARRAY_SIZE; i++ )
    {
        //for( int j = i; j<ARRAY_SIZE-1; j++ )
        {
            loc = min_arr(arr1,(ARRAY_SIZE-i));
            // for debug:
            //std::cout << "min found at " << loc << std::endl;
            swap(&arr[loc+i],&arr[i]);

            // for debug:
            //for( int i =0; i<ARRAY_SIZE; i++ )
            //  cout << arr[i] << " ";
            //cout << std::endl;

            arr1++;
        }
    }   

    for( int i =0; i<ARRAY_SIZE; i++ )
        cout<<arr[i]<<endl;

    return 0;
}

int min_arr( int arr[], int size )
{
    int k=0;
    int temp=arr[0];
    for( int i=1; i<size; i++ )
    {
        if( arr[i] < temp )
        {
            temp=arr[i];
            k=i;
        }   
    }
    return k;
}

void swap(int *a, int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}  

Это выведет:

2
3
12
31
34
43
55
77
89
98

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

Прежде всего, вызов функции min_arr. Требуется массив, а не указатель:

loc=min_arr(arr,(10-i));

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

int min_arr(int arr[],int size)
{
int k=10-size;
int temp=arr[k];
for(int i=k+1;i<10;i++)
{
    if(arr[i]<temp)
    {
        temp=arr[i];
        k=i;
    }
    }

   return k;
}
for(int i=0;i<10;i++)
  {
    for( int j=i;j<9;j++)  //shouldn't this be j < 10 ?
......
Другие вопросы по тегам