Nickolay.info. Алгоритмы. Удаление повторяющихся значений из массива

Такая задача нередко возникает при анализе данных. Хорошо программистам на PHP, у которых есть стандартная функция array_unique для этой цели, а вот на компилируемых языках приходится изобретать. Первое, что приходит в голову - ввести дополнительный массив, в который перепишем элементы исходного массива, встречающиеся только один раз. Теоретически мы должны найти последние вхождения каждого элемента и посчитать их как единственные.

const n=10;
 a: array [1..n] of integer=(1,2,3,1,0,-2,2,5,4,0);
var b: array [1..n] of integer;
 i,j,k,l:integer;
begin
 l:=0;
 for i:=1 to n do begin
  k:=1;
  for j:=i+1 to n do if a[i]=a[j] then inc(k);
  if k=1 then begin inc(l); b[l]:=a[i]; end;
 end;
 writeln ('Уникальные элементы');
 for i:=1 to l do write (b[i]:3);
 reset (input); readln;
end.

Можно обойтись и без использования дополнительного массива, но тогда понадобится ещё один цикл для "сжатия" массива с целью удаления лишних повторений.

const size=10;
 a: array [1..size] of integer=(1,2,3,1,0,-2,2,5,4,0);
var i,j,k,n:integer;
begin
 n:=size;
 i:=1;
 while i<=n do begin
  j:=i+1;
  while j<=n do begin
   if a[i]=a[j] then begin
    for k:=j to n-1 do a[k]:=a[k+1];
    dec(n);
   end
   else inc(j);
  end;
  inc(i);
 end;
 writeln ('Уникальные элементы');
 for i:=1 to n do write (a[i]:3);
 reset (input); readln;
end.

Для нашего теста в обоих случаях получаем 1 2 3 0 -2 5 4, но второй алгоритм сохранит первоначальный порядок элементов в массиве.

Рейтинг@Mail.ru

вверх гостевая; E-mail