Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Алгоритм сортировки целочисленного массива на C


Автор: red2 13.5.2013, 07:36
Код

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void fillDesc(int size, int * array);
void fillAsc(int size, int * array);
void fillRand(int size, int * array);

void sortBubble(int size, int * array);
void sortInsertion(int size, int * array);
void sortSelection(int size, int * array);
void MergingSort(int size, int * array);
void displayArray(int size, int * array);



int main()
{
    int size = 0, item = 0;
    int * array;

    printf("Input size array: ");                    /*Просьба ввести размер массива*/
    scanf("%i", &size);                                  /*Вводим размер массива*/

array = malloc(size * sizeof(int));          /* Функция malloc - возвращает указатель на первый байт области памяти размером size, которая была выделена из динамически распределяемой области памяти*/

    while(!item)
    {
        printf("\nFill array:\n");                       /*Заполним массив отдним из способов*/
        printf("1 - Descending order\n");                /*По убыванию*/
        printf("2 - In ascending\n");                    /*По возрастанию*/
        printf("3 - Random\n");                          /*Случайными числами*/
        printf("Enter the item number... ");         /*Введите номер элемента*/
        scanf("%i", &item);                              /*Вводим как мы хотим заполнить массив*/

switch(item)                                     /* Взависимости какой способ мы выбрали switch выполняет  переход на ту или иную метку*/
        {
            case 1: fillDesc(size, array); break;        /*А  операторы case определяют эти самые метки,   в данном случае по убыванию*/
            case 2: fillAsc(size, array); break;          /*По возрастанию*/
            case 3: fillRand(size, array); break;          /*Случайными числами*/
            default : printf("\n Invalid item\n"); item = 0; break;         /*Проверка соответствия введенному значению*/
        }
    }

displayArray(size, array);                          /*Выводим на экран размер и массив с выбраным заполнением*/

    item = 0;
    while(!item)
    {
        printf("\n\nSorting array:\n");                      /* Сортирвка массива*/
        printf("1 - Buble sort\n");                          /* Пузырьковая. */
        printf("2 - Insertion sort\n");                          /*Сортировка вставкой..*/
        printf("3 - Selection sort\n");                              /*Сортировка выбором.*/
        printf("4 - MergingSort\n");                                 /*Сортировка слиянием*/
        printf("Enter the item number...");                        /*Введите номер элемента*/
        scanf("%i", &item);

switch(item)                                                 /* Взависимости какой способ мы выбрали switch выполняет
                                                                             переход на ту или иную метку*/
        {
            case 1: sortBubble(size, array); break;                /*пузырьковая сортировка*/
            case 2: sortInsertion(size, array); break;              /*сортировка вставкой*/
            case 3: sortSelection(size, array); break;               /*сортировка выбором*/
            case 4: MergingSort(size, array); break;                 /*сортировка слиянием*/
            default : printf("\n Invalid item\n"); item = 0; break;      /*Проверка соответствия веденному значению*/
        }
    }

    displayArray(size, array);

    free(array);

    return 0;
}

void fillDesc(int size, int * array)                     /*Метод заполнения по убыванию*/
{
    int i;
    for(i = 0; i < size; i++)
        array[i] = size - i - 1;
}

void fillAsc(int size, int * array)              /*Метод заполнения по возрастанию*/
{
    int i;
    for(i = 0; i < size; i++)
        array[i] = i;
}

void fillRand(int size, int * array)             /*Метод заполнения случайными числами*/
{
    srand(time(NULL));

    int i;
    for(i = 0; i < size; i++)
        array[i] = rand()%100;
}

void sortBubble(int size, int * array)                   /*Метод сортировки пузырьком*/
{
    int i, j, tmp;
    for(i = 0; i < size - 1; i++)
    {
        for(j = 0; j < size - i - 1; j++)
        {
            if(array[j] > array[j + 1])
            {
                tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
            }
        }
    }
}

void sortInsertion(int size, int * array)                    /*Метод сортировки вставкой*/
{
    int i, j, tmp;
    for (i = 1; i < size; i++)
    {
        tmp = array[i];

        j = i - 1;
        while(j >= 0 && array[j] > tmp)
        {
            array[j + 1] = array[j];
            j--;
        }

        array[j + 1] = tmp;
    }
}

void sortSelection(int size, int * array)                       /*Метод сортировки выбором*/
{
     int i, j, min, tmp;
     for (i = 0; i < size - 1; i++)
     {
        min = i;

        for(j = i + 1; j < size; j++)
        {
            if(array[j] < array[min])
                min = j;
        }
        if(min != i)
        {
            tmp = array[i];
            array[i] = array[min];
            array[min] = tmp;
        }
    }
}
void MergingSort(int size, int * array)  /*Метод сортровки слиянием */
{
  int i, j, k, t, s, min, min2;
  int * tmp = new int[size];
  k = 1;
  while (k < size){
    t = 0;
    s = 0;
    while (t+k < size){
      min = t+k;
      min2 = (t+2*k < size ? t+2*k : size);
      i = t; 
      j = min;
      for ( ; i < min && j < min2 ; s++){
        if (array[i] < array[j]) {
          tmp[s] = array[i];
          i++;
        }
        else {
          tmp[s] = array[j];
          j++;
        }
      }
      for ( ; i < min; i++, s++)
        tmp[s] = array[i];
      for ( ; j < min2; j++, s++)
        tmp[s] = array[j];
      t = min2;
    }
    k *= 2;
    for (s = 0; s < t; s++)
      array[s] = tmp[s];
  }
  delete(tmp);
}

void displayArray(int size, int * array)
{
    int i;
    printf("\nArray: ");
    for(i = 0; i < size; i++)
        printf("%i ", array[i]); }

Код вызывает такие ошибки. В чем может быть проблема?
user posted image

Автор: kolesnle 13.5.2013, 08:21
 В начале допиши 
Код

#include "stdafx.h"

Код

array =(int*) malloc(size * sizeof(int)); 

лучше
Код

array = new int[size]; 

но, тогда и освобождать память надо с помощью delete

Автор: red2 13.5.2013, 11:30
Теперь он мне выдает, вот такую штуку.
user posted image

Автор: math64 13.5.2013, 11:52
Да не нужен этот #include "stdafx.h" ! Просто отключи в проекте использование прекомпилированных заголовков!

Автор: red2 13.5.2013, 14:24
Всем большое спасибо за помощь! Программа заработала!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)