Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2013, 21:15   #1
novopashinmm
 
Регистрация: 27.06.2013
Сообщений: 7
Вопрос Сортировка массива

Нужно отсортировать массив по возрастанию сравнивая поочередно соседние члены, причем каждый из элементов массива за один проход цикла может сделать не больше одного перемещения вправо или влево. То есть нужно сравнивать парами 0-й элемент и 1-й, 2-й и 3-й ну и т.д.
Какие Ваши предложения?

Если во 2 цикле j будет принимать значения 0 и 1 поочередно то массив отсортируется.
Код:
#include <stdio.h>
main () {
int dig[4]={4,3,2,1};
int i,j,min,d,N;
N=4;
for (i=0; i<N; i++){
for (j=i; j<N; j+=2)
d=j+1;
if dig[d]<dig[j]
min=d;
dig[d]=dig[j];
dig[j]=dig[min];
}
for (i=0; i<N; i++)
printf ("%d", dig[i]);
}

Последний раз редактировалось Stilet; 03.07.2013 в 08:11.
novopashinmm вне форума Ответить с цитированием
Старый 02.07.2013, 21:39   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,367
По умолчанию

Моё предложение:
1. Так думаю, что нужно использовать другой тип цикла:
do
...
while <условие>;
2. При просмотре пар (начинаем с 0-го элемента) фиксируем, было ли перемещение в паре, если да, то переходим к следующей паре (индекс меняем с шагом 2), а иначе индекс меняем с шагом 1.
3. При следующем просмотре начинаем с элемента 1.
Надо учитывать, что для последнего элемента может не быть пары.
4. Цикл завершаем, если перемещений при просмотре не было.
Пример:
3 7 9 5 6
7 3 9 6 5
7 9 3 6 5
9 7 6 3 5
9 7 6 5 3

Вроде так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 03.07.2013, 01:34   #3
novopashinmm
 
Регистрация: 27.06.2013
Сообщений: 7
По умолчанию

тут дело в том что, за один проход цикла если это цикл for, каждый элемент может переместится один раз, то есть из 4 3 2 1 подчеркнутые меняются, за один проход цикла можем получить 3 4 1 2. В Вашем алгоритме разве это условие соблюдается? Например 3 за весь этот цикл do ... while, поменяла свое положение 5 раз.
novopashinmm вне форума Ответить с цитированием
Старый 03.07.2013, 08:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
причем каждый из элементов массива за один проход цикла может сделать не больше одного перемещения вправо или влево.
novopashinmm, мне интересно, а почему перемещение вправо/влево вы понимаете как перемещение вправо влево на соседнюю позицию?!
например, дано 4 3 2 1
меняем 4-ку и 1цу местами
получаем 1 3 2 4
поясните, сколько, по вашему, перемещений в данном примере сделал каждый из элементов массива?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2013, 09:38   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,367
По умолчанию

Цитата:
В Вашем алгоритме разве это условие соблюдается? Например 3 за весь этот цикл do ... while, поменяла свое положение 5 раз.
1. Не 5, а только 4-е.
2. Да. Алгоритм изложил не точно.
Внутри цикла do ... While должен быть цикл для просмотра всех пар массива (пункт 2).

Serge_Bliznykov
Цитата:
а почему перемещение вправо/влево вы понимаете как перемещение вправо влево на соседнюю позицию?!
Там по условию:
Цитата:
Нужно отсортировать массив по возрастанию сравнивая поочередно соседние члены

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 03.07.2013, 09:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Нужно отсортировать массив по возрастанию сравнивая поочередно соседние члены
так. стоп. ну, сравнивая соседние члены легко найти индекс масимального элемента. Кто помешает потом поменять местами НЕ СОСЕДНИЕ члены массива (ограничения на такой обмен я в условии не увидел. Проглядел?..)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2013, 10:53   #7
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Предлагаю вашему вниманию новейщий алгоритм сортировки.


Код:
#include "stdio.h"
#include "stdlib.h"

void fill(int* arr,const int size)
{
  long seed = time(NULL);
  srand(seed);
  for(int i = 0; i < size; i++)
  {
	 arr[i] = rand()%100 + 1;
  }
}

bool sorted(int* arr,const int size)
{
  for(int i = 0; i < size - 1; i++)
	 if(arr[i+1] < arr[i])
	   return false;
  return true;
}

int main()
{
  int arr[4] = {0,};
  fill(arr,4);
  while(!sorted(arr,4))
	fill(arr,4);
  for(int i = 0; i < 4; i++)
	printf("%d ",arr[i]);
  return 0;
}
Помог? Оставляем отзыв =)

Последний раз редактировалось Helloween; 03.07.2013 в 11:56.
Helloween вне форума Ответить с цитированием
Старый 03.07.2013, 21:12   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,367
По умолчанию

Прошу простить за делитанский подход, но используя пример выше
реализовал алгоритм так:
Код:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <time.h>

void fill(int* arr,const int size)
{
  long seed = time(NULL);
  srand(seed);
  for(int i = 0; i < size; i++)
  {
	 arr[i] = rand()%100 + 1;
  }
};

bool sorted(int* arr,const int size)
{
	bool chng;
   int i, tmp;
   chng = false;
   i = 0;
   do
  {
     if (arr[i] < arr[i+1])
     {
        tmp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = tmp;
        chng = true;
        i = i + 2;
     }
     else
        i = i + 1;
  } while (i <= (size -1));
return chng;
};

int main()
{
  const int n = 10;
  int arr[n] = {0,};
  fill(arr,n);
  do
  {
    for(int i = 0; i < n; i++)
	   printf("%d ",arr[i]);
       printf("\n");
  } while(sorted(arr,n));

  for(int i = 0; i < n; i++)
	printf("%d ",arr[i]);
  return 0;
}
Проверить верность записи на Си и его работу пока не могу.
Проверил и отладил.

Во вложении этот алгоритм на Паскале.


Как-то так, ...
Вложения
Тип файла: txt exp_01.txt (542 байт, 136 просмотров)
Как-то так, ...

Последний раз редактировалось ViktorR; 03.07.2013 в 22:31. Причина: Исправлен код
ViktorR вне форума Ответить с цитированием
Старый 04.07.2013, 23:43   #9
novopashinmm
 
Регистрация: 27.06.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
novopashinmm, мне интересно, а почему перемещение вправо/влево вы понимаете как перемещение вправо влево на соседнюю позицию?!
например, дано 4 3 2 1
меняем 4-ку и 1цу местами
получаем 1 3 2 4
поясните, сколько, по вашему, перемещений в данном примере сделал каждый из элементов массива?
Вас понял, точно, перемещение влево, вправо не подразумевает перемещение только на соседнюю позицию, 1 и 4 тоже могут поменяться за один ход цикла. тогда 4 3 2 1 отсортируется за 3 цикла
4 3 2 1
3 4 1 2
2 1 4 3
1 2 3 4
novopashinmm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
сортировка массива dimas935 Помощь студентам 1 18.10.2011 15:34
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
сортировка массива nex 9119 Помощь студентам 1 16.12.2010 15:58
Сортировка массива Neksion Помощь студентам 1 02.12.2010 16:46