Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

нестандартная сортировка одномерного массива

431
05 января 2007 года
sherry
207 / / 16.10.2006
В общем, дело было так. Был мне "дарован" массив А(15), состоял и всевозможных целых чисел. Задача момента: отсортировать массив таким образом, чтобы вначале шли нули, потом отрицательные числа, а затем положительные; при этом порядок следования чисел не должен меняться. Я с этой задачкой справился следующим образом: взял ещё один массив такой же размерности и типа, и заполнил его числами исходного массива использовав при этом 3 простеньких цикла. Казалось, бы всё просто - живи да радуйся... НО! Задачку нужно выполнить без использования вспомогательных массивов! Сортировка, обмен местами элементов и ничего кроме этого!

Надеюсь на Ваш дружественный хелп...
11K
05 января 2007 года
.nornad
125 / / 04.01.2007
Если попроще в реализации и понимании принципа, то потребуются три переменные. Они будут содержать индексы последних элементов уже "упорядоченного" списка (в одной - последнего нулевого, в другой - последнего отрицательного, в третьей - последнего положительного элемента).
Суть алгоритма такова. Сначала все три переменных равны 0. Ах да, забыл, нужна ещё переменная текущего обрабатываемого индекса. Для этого вполне пригодится обычный счётчик цикла.
Берём очередной элемент и определяем к какой группе он относится. От группы получаем индекс её последнего элемента, до которого надо в обратном порядке пройтись от текущего на каждом шаге меняя местами два соседних элемента. После прохождения этой "змейки" надо обновить переменные для текущей группы и для групп, которые условно назовём правыми относительно той, в которую попал текущий элемент.
Чтобы было понятнее, перечислим слева направо группы:
нулевые элементы -> отрицательные -> положительные

P.S. Можно сделать и без дополнительных переменных, но с логикой будет чуток сложнее - каждый раз придётся разбираться, в своей ли группе элемент, или ещё нет.
242
06 января 2007 года
Оlga
2.2K / / 04.02.2006
код сортировки на С, Паскаль не учила, поэтому решила не мучиться, но [COLOR=seagreen]коментарии [/COLOR]чуток набрасала.
lang C
Код:
#include <stdio.h>
 
void main(void)
{
    int arr[] = {4,-1, -2, 0, 1, -3, 0, 0, 2, 3, -4};  [COLOR=seagreen]{the array - 11 elements}[/COLOR]
    int i, j, temp; [COLOR=seagreen]{variables of type integer}[/COLOR]
 
    for(i = 1; i < 11; i = i+1) [COLOR=seagreen]{for i = 2 to 11, increment by 1}[/COLOR]
    {
        if(arr == 0)  {if arr = 0 then}
        {  [COLOR=seagreen]<- begin[/COLOR]
            j = i-1;
            while(j >= 0 && arr[j] != 0) [COLOR=seagreen]{repeat}[/COLOR]
            {
                arr[j+1] = arr[j];
                j = j - 1;
            }
            arr[j+1] = 0;
        }  [COLOR=seagreen]<- end[/COLOR]
        else if(arr < 0)
        {
            j = i-1; temp = arr;
            while(j >= 0 && arr[j] > 0)  
            {
                arr[j+1] = arr[j];
                j = j - 1;
            }
            arr[j+1] = temp;
        }
    }
}


[COLOR=red]Нарушение: неправильно названа тема. название должно отражать суть вопроса[/COLOR], например: нестандартная сортировка одномерного массива.
431
06 января 2007 года
sherry
207 / / 16.10.2006
Спасибо, конечно... Но мне до С, как.. Ну в общем очень далеко! :)
257
06 января 2007 года
kosfiz
1.6K / / 18.09.2005
вот код OlgaKr только переведенный на Pascal и добавлены мной заполнение массива произвольными числами, вывод исходного и полученного массивов. Алгоритм же предложенный OlgaKr полностью сохранен.
Код:
const n=15;
var i,j,temp:integer;
    arr:array[1..n]of integer;
begin
randomize;                  //этот блок нужен для того, чтобы забить массив произвольными числами в интервале [-20 ; 20]
for i:=1 to n do
 begin
  arr:=-20+random(40);
  write(' ',arr);
 end;
writeln;
// отсюда код OlgaKr
 for i:= 2 to n do
  begin
    if arr=0 then
      begin
       j:= i-1;
         while(j>= 0) and (arr[j]<> 0) do
            begin
                arr[j+1]:=arr[j];
                j:= j - 1;
            end;
            arr[j+1]:= 0;
        end
        else if(arr < 0) then
        begin
            j:= i-1; temp:= arr;
            while(j>=0) and (arr[j]>0) do
             begin
                arr[j+1]:= arr[j];
                j:= j - 1;
             end;
            arr[j+1]:= temp;
        end;
    end;
// вывод полученного отсортированного массива
for i:=1 to n do
 write(' ',arr);
readln;
end.

вроде правильно переделал.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог