#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;
}
}
}
нестандартная сортировка одномерного массива
Надеюсь на Ваш дружественный хелп...
Суть алгоритма такова. Сначала все три переменных равны 0. Ах да, забыл, нужна ещё переменная текущего обрабатываемого индекса. Для этого вполне пригодится обычный счётчик цикла.
Берём очередной элемент и определяем к какой группе он относится. От группы получаем индекс её последнего элемента, до которого надо в обратном порядке пройтись от текущего на каждом шаге меняя местами два соседних элемента. После прохождения этой "змейки" надо обновить переменные для текущей группы и для групп, которые условно назовём правыми относительно той, в которую попал текущий элемент.
Чтобы было понятнее, перечислим слева направо группы:
нулевые элементы -> отрицательные -> положительные
P.S. Можно сделать и без дополнительных переменных, но с логикой будет чуток сложнее - каждый раз придётся разбираться, в своей ли группе элемент, или ещё нет.
lang C
Код:
[COLOR=red]Нарушение: неправильно названа тема. название должно отражать суть вопроса[/COLOR], например: нестандартная сортировка одномерного массива.
Спасибо, конечно... Но мне до С, как.. Ну в общем очень далеко! :)
Код:
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.
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.
вроде правильно переделал.