Сортировка массива Вопрос - PullRequest
1 голос
/ 25 мая 2011

Я использую Turbo C, и у меня есть вопрос о моем коде. Я просто озадачен ... Программа сначала запрашивает список чисел (вы не должны набирать больше 20). Когда пользователь вводит числа, они помещаются в массив list[]. Как только пользователь завершает список, набирая 0 * (которого нет в списке) *, программа вызывает функцию sort(), которая сортирует значения в списке. В последней части, в которой есть комментарий /*I AM NOW CONFUSED WITH THIS PART*/, есть часть, где мне нужна ваша помощь ... Пожалуйста, помогите мне.

enter image description here

       File   Edit   Run   Compile   Project   Options   Debug   Break/watch
    ╒════════════════════════════════════ Edit ════════════════════════════════════╕
    │      Line 1     Col 43  Insert Indent Tab Fill Unindent * C:NONAME.C         │
    │                                                                              │
    │ #define MAXSIZE 20                            /* size of buffter */          │
    │ void sort(int[], int);                        /* prototype */                |
    │                                                                              |
    │ main()                                                                       |
    │ {                                                                            |
    │     static int list[MAXSIZE];                 /* buffer for numbers */       |
    │     int size = 0;                             /* size 0 before input */      |
    │     int dex;                                  /* index of array */           |
    │     do                                        /* get list of numbers */      |
    │     {                                                                        |
    │         printf("Type number: ");                                             |
    │         scanf("%d", &list[size]);                                            |
    │     }                                                                        |
    │     while(list[size++] != 0);                 /* exit loop on 0 */           |
    │                                                                              |
    │     sort(list,--size);                        /* sort nubmers */             |
    │     for(dex=0; dex<size; dex++)               /* print sorted list */        |
    │         printf("%d\n", list[dex]);                                           |
    │                                                                              |
    │      getche();                                                               |
    │ }                                                                            |
    │                                                                              |
    │ void sort(int list[], int size)                                              |
    │ {                                                                            |
    │     int out, in, temp;                        /* I AM NOW CONFUSED */        |
    │                                                                              |
    │     for(out=0; out<size-1; out++)             /* IN THIS PART! */            |
    │         for(in=out; in<size; in++)                                           |
    │              if(list[out] > list[in])                                        |
    │              {                                                               |
    │                  temp=list[in];                                              |
    |                  list[in]=list[out];                                         |
    │                  list[out]=temp;                                             |
    │              }                                                               |
    │ }                                                                            |
    │                                                                              |
    │                                                                              |
    ├─────────────────────────────────── Watch ────────────────────────────────────┤
    │                                                                              │
    └──────────────────────────────────────────────────────────────────────────────┘
     F1-Help  F5-Zoom  F6-Switch  F7-Trace  F8-Step  F9-Make  F10-Menu   NUM

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

Это просто код, предназначенный для сортировки элементов массива, но он никогда не будет работать в его текущей форме, так как:

temp=list[in];
list[out]=temp;

перезапишет list[out] с list[in] без сохранения исходного содержимого list[out].

Лучший способ поменять местами две переменные это что-то вроде:

temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;

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

Итак, если ваш вопрос заключается в том, как отсортировать данные, тогда должен помочь следующий псевдокод. Я бы предоставил код на C, но если у вас нет шансов, что это домашнее задание, вы должны выполнить часть работы самостоятельно a .

def sort (arr[], sz):
    swapped = true                       # Force loop entry.
    while swapped:                       # Loop until a pass had no swaps.
        swapped = false
        for idx goes from 1 to sz-1:     # For all but the first element.
            if arr[idx-1] > arr[idx]:    # If order is wrong.
                swapped = true           # More passes will be needed.
                temp = arr[idx-1]        # Swap
                arr[idx-1] = arr[idx]    #   the
                arr[idx] = temp          #     elements.

Это разновидность пузырьковой сортировки, которая завершается сразу после сортировки списка (ну, после одного прохода без перестановок). Некоторые наивные варианты просто продолжат примерно n<sup>2</sup> раза независимо

.

a Если вы хотите указать в комментарии, что это не домашнее задание, я был бы рад предоставить код C. Просто знайте (если вы планируете врать мне), что ваши преподаватели почти наверняка смогут увидеть этот код, и вы, вероятно, потерпите неудачу в этом случае (или будете исключены за явный плагиат).


И, поскольку вы заявили, что это не домашняя работа, вот полная программа на C, иллюстрирующая это:

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

#define FALSE (1==0)
#define TRUE  (1==1)

static void sort (int arr[], int sz) {
    int idx, temp, swapped;

    swapped = TRUE;                        // Force loop entry.
    while (swapped) {                      // Loop until a pass had no swaps.
        swapped = FALSE;
        for (idx  = 1; idx < sz; idx++) {  // For all but the first element.
            if (arr[idx-1] > arr[idx]) {   // If order is wrong.
                swapped = TRUE;            // More passes will be needed.
                temp = arr[idx-1];         // Swap
                arr[idx-1] = arr[idx];     //   the
                arr[idx] = temp;           //     elements.
            }
        }
    }
}

int main (int argc, char *argv[]) {
    int sz, i, *vals;

    sz = argc - 1;
    if (sz < 1)
        return 0;
    if ((vals = malloc (sz * sizeof (int))) == NULL) {
        printf ("ERROR: Cannot allocate memory.\n");
        return 1;
    }

    for (i = 0; i < sz; i++)
        vals[i] = atoi (argv[i+1]);

    printf ("Numbers before:");
    for (i = 0; i < sz; i++)
        printf (" %d", vals[i]);
    printf ("\n");

    sort (vals, sz);

    printf ("Numbers after :");
    for (i = 0; i < sz; i++)
        printf (" %d", vals[i]);
    printf ("\n");

    free (vals);
    return 0;
}

Запуск этого с:

$ ./testprog 3 1 4 1 5 9 2 6 5 3 5 8 9

дает вам вывод:

Numbers before: 3 1 4 1 5 9 2 6 5 3 5 8 9
Numbers after : 1 1 2 3 3 4 5 5 5 6 8 9 9
1 голос
/ 25 мая 2011

Перестановка значений в самом внутреннем цикле sort() не завершена.Он никогда не присваивает list[in] чему-либо.

0 голосов
/ 25 мая 2011

Я верю, что вы пытаетесь сделать следующее. По сути, вы пытаетесь найти минимальный элемент на каждой итерации внутреннего цикла. Например, если вы начнете с массива [5,4,3,2,1], после первой итерации внутреннего цикла массив будет выглядеть следующим образом:

[5,4,3,2,1]: после in = 0

[4,5,3,2,1]: после in = 1

[3,5,4,2,1]: после in = 2

[2,5,4,3,1]: после в = 3

[1,5,4,3,2]: после in = 4

Теперь 1 в начале. В конце концов, массив будет отсортирован как [1,2,3,4,5].

void sort(int list[], int size) {
    int out, in, temp;       
    for(out=0; out<size; out++)  {        |
        for(in=out; in<size; in++)                                           
            if(list[out] > list[in])                                        
            {                                                               
                tmp = list[out]
                list[out]=list[in];
                list[in] = tmp                                                                                           
            }    
    }                                                           
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...