Karışık sayıyı sıralayıp gruplama algoritması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Karışık sayıyı sıralayıp gruplama algoritması

Mesaj gönderen greenegitim »

elimizde 1 den 1000 e kadar sayılar var ama sayıların yeri karşık (1,2,5,50,44,45,60,75,11....) bu sayıları (1-5, 10-15, ...) bu şekilde belli aralıkta
dizilere atan bir algoritma en küçük sayıdan başlayarak 2,3,4,5 var mesela bunu 2-5 yazacak daha sonra gelen sayı dizi 10,11,12,13,14,15 bunu da 10-15 yazacak.
sonuç 2-5, 10-15 , 20-22 , 45-48 .. bu şekilde bir algoritma fikri olan?
Mücadele güzelleştirir!
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Re: Karışık sayıyı sıralayıp gruplama algoritması

Mesaj gönderen baypipox »

normalde aklıma bir çok yöntem geliyo ama en zahmetsizi bana göre eğer vt kullanıyosan, gelen verileri bir tabloda bir alana basar, asc ve desc yardımı ile geri çekerdim...
ama yok vt kullanmıyosan en kolay yine array kullanarak yaparsın. heleki değerler misal 1-1000 arasında 30 tane değer gelecekse iş iyice kolaylaşır.. Delphinin matematiksel fonksiyonlarınada bir göz at derim mutlaka işe yarar bişey bulursun..
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Re: Karışık sayıyı sıralayıp gruplama algoritması

Mesaj gönderen kirve »

bi kac tane sıralama algoritması mevcut bunun icin
bunları söyleyim sana
1- selection sort
2-quiksort
3-mergesort
aklıma gelenler bunlar bu algortimalar calısma zamanları bakımından birbirinden farklıdır eldeki verine gore zaman karmasıklıgını degistirirsin.
selection sor en basitidir. mantıgı dizi icindeki 1. elemanı alır 2. ile karsılartır büyüklük kücüklük durumuna göre yer degistirir bu sekilde istedigin sıralamayı yaparsın.
sana bunun kodlarınıda yazarım buraya ama muhtemelen bu sana verilen odevdir. sen simdi burdan bunu kopyala yapıstır yaparsın. ve bilgi anlamında sana hic birsey kazandırmaz. bu selection sortu incele sözde kod ile buraya yaz sana kodlarını vereyim en azından mantıgını anlamıs olursun.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Karışık sayıyı sıralayıp gruplama algoritması

Mesaj gönderen greenegitim »

buraya kadar geldim sayı ve döngüler aşağıda az olarak belirtim

Kod: Tümünü seç

var
  dizi:array[1..10] of Integer;
  i,j,temp:Integer;
begin
  for i:= 1 to 10 do begin
    dizi[i]:=StrToInt(ListBox1.Items[i-1]);

  end;
            for i:=1 to 10 do begin
              for j:=1 to 9 do begin
                if dizi[j]> dizi[j+1] then begin
                  temp:=dizi[j];
                  dizi[j]:=dizi[j+1];
                  dizi[j+1]:=temp;
                end;
              end;
            end;
            for i:= 1 to 10 do ListBox2.Items.Add(IntToStr(dizi[i]));
end;
Mücadele güzelleştirir!
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Re: Karışık sayıyı sıralayıp gruplama algoritması

Mesaj gönderen kirve »

procedure TForm1.Button1Click(Sender: TObject);
var
adet,i,j,temp:integer;
dizi: array of integer;
begin
adet:=ListBox1.Items.Count;//eleman sayısını aldık
SetLength(dizi,adet);////diziyi eleman sayısı kadar boyutlandırdık. buraya sen sabit bi sayıda girebilirsin
for i := 0 to adet-1 do
begin
dizi:=StrToInt(ListBox1.Items.Strings);//////listboxtaki verileri diziye aldık

end;
for i := 0 to adet - 2 do/// i değişkenini eleman sayısının 2 eksigi kadar donder
begin
for j := i+1 to adet-1 do//// j degiskenini i degerinin bir fazlasından baslat ve dizinin eleman sayısı kadar donder
begin
if dizi>dizi[j] then////// dizinin n. ci elemanı dizinin n+1 . elemanından büyükse yerlerini degistir.
begin
temp :=dizi[j];
dizi[j] :=dizi;
dizi :=temp;
end;
end;
end;

for i := 0 to adet - 1 do
begin
ListBox2.Items.Add(IntToStr(dizi));///// ikinci diziye aktar.
end;


bu algortima karmaşıklığı n kareye sahiptir. yani verilerin cogaldıkca hızı yavaslıcaktır. tavsiyem bu gibi sıralamalarda eleman sayısını bilmiyorsan ya merge sortu kullan yada quik sortu kullan ikiside n karmasıklıgına sahip olması lazım
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Karışık sayıyı sıralayıp gruplama algoritması

Mesaj gönderen greenegitim »

php de istediğimi aşağıdaki kodlarla alabiliyorum

Kod: Tümünü seç

<?php
$ar=array(3,5,7,2,1,10,15,13,15,20,22,28,30,31,32,35,36);

asort($ar);
$aralik=5;
$araArtis=5;
foreach($ar as $a=>$d){
    if($d<$aralik+1){
        $tumu[($aralik-$araArtis+1)."-".$aralik][]=$d;
    }else{
        $aralik+=$araArtis;
        $tumu[($aralik-$araArtis+1)."-".$aralik][]=$d;
    }
}

echo "<pre>";
print_r($tumu);
echo "</pre>"
?>
ekran çıktısı şöyle oluyor
Array
(
[1-5] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 5
)

[6-10] => Array
(
[0] => 7
[1] => 10
)

[11-15] => Array
(
[0] => 13
[1] => 15
[2] => 15
)

[16-20] => Array
(
[0] => 20
)

[21-25] => Array
(
[0] => 22
)

[26-30] => Array
(
[0] => 28
[1] => 30
)

[31-35] => Array
(
[0] => 31
[1] => 32
[2] => 35
)

[36-40] => Array
(
[0] => 36
)

)
bunu delphide memoda yapmam için ne yapmam lazım çözemedim bir türlü
Mücadele güzelleştirir!
Cevapla