Kod:
NOT: İleri seviye pluginciler için anlatımdır. Amaç beyin fırtınasıdır.
Kütüphanede hazır verilen Arraysort tarzı paketleri de kullanabilirsiniz.
Sıralama konusu oldukça karışık olmakla birlikte hangi data tipini sıralayacağımız hangi sıralama tipini kullanacağımızı değiştirebilir. Bu konuda bubble sort yani integer sıralamasının mantığını gösteriyorum...
Videoda arkadaş en kötü senaryoyu n(n+1)/2 diye söylemiş. Bu yanlıştır fakat mantığını güzel anlatmış. Doğru yazıldığında en fazla karşılaşacağımız döngü sayısı n'in 2li kombinasyonu yani n(n-1)/2 şeklindedir.
Örnek Plugin:
Konsola "siralama" yazarak çalıştırabiliriz.
PHP Kod:
/*
.__
_____ | | ____ ___ ___
\__ \ | | _/ __ \\ \/ /
/ __ \| |_\ ___/ > <
(____ /____/\___ >__/\_ \
\/ \/ \/
*/
#include <amxmodx>
#include <amxmisc>
public plugin_init() {
register_plugin(
"None",
"v0.1",
"aLeX"
);
register_clcmd("siralama","siralama");
}
public siralama(id) {
new tutucu,dizi[] = {1,2,-1,4,5,4,6,9,100};
for(new i;i<sizeof(dizi);i++) console_print(id,"%i nolu eleman: %i",i+1,dizi[i]);
console_print(id,"Siralama yapiliyor...");
new tursayisi;
for(new i;i<sizeof(dizi)-1;i++) {
new bool:kontrol;
for(new k;k<sizeof(dizi)-1-i;k++) {
if(dizi[k] > dizi[k+1]) {
tutucu = dizi[k];
dizi[k] = dizi[k+1];
dizi[k+1] = tutucu;
kontrol = true;
}
tursayisi++;
}
if(!kontrol) break;
}
console_print(id,"Siralama tamamlandi.^nToplam dongu sayisi: %i",tursayisi);
for(new i;i<sizeof(dizi);i++) console_print(id,"%i nolu eleman: %i",i+1,dizi[i]);
return PLUGIN_HANDLED_MAIN;
}
Kod:
///////////////////////////////////
// MoeRu Army //
// Coder Team'den [Burkay] //
// Alımlarımız Başlamıştır. //
// Since 2018 //
///////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
int tutucu,tursayisi=0,boyut,i,j;
printf("Girilecek Sayi Sayisi : ");
scanf("%d",&boyut);
int dizi[boyut];
for(i=0;i<boyut;i++)
{
printf("%d. Sayinizi Giriniz : ",i+1);
scanf("%d",&dizi[i]);
}
for(i=0;i<boyut-1;i++) {
bool kontrol;
kontrol = false;
for(j=0;j<boyut-1-i;j++)
{
if(dizi[j] > dizi[j+1]) {
tutucu = dizi[j];
dizi[j] = dizi[j+1];
dizi[j+1] = tutucu;
kontrol = true;
}
tursayisi++;
}
if(!kontrol) break;
}
printf("Siralama Tamamlandi.\nToplam Dongu Sayisi : %d\n",tursayisi);
for(i=0;i<boyut;i++)
printf("%d. Nolu Eleman : %d\n",i+1,dizi[i]);
return 0;
}
Neden dış döngü neden n değil n-1 tanedir?
Her döngüde dizinin x'inci sayısıyla x+1'inci sayısı karşılaştırılıyor. n-1'lik döngünün sonunda n-1 ve n'inci sayıları karşılaştırdığımız için fazladan bir döngüye ihtiyacımız yok.
Neden iç döngü n-i-1 tanedir?
Her bir dış göngüde en büyük sayı en sona gider. Yani en sonda en büyük sayılar toplanacağı için sondaki sayıları kontrol etmemize gerek kalmaz.
Kontrol isimli bool ne işe yarar?
Pluginde tanımlı "kontrol" maximum n(n-1)/2 tane olacak döngü sayısını azaltmak amacıyla kullanılır. Dışta olan herhangi bir döngü bittiğinde iç döngüde swap yapılmadıysa (bütün sayılar sıralıysa) döngü kırılır. Sorting işlemi tamamlanmıştır.
Son olarak ilginizi çekebilecek farklı sıralama işlemlerinin gösterildiği bir video paylaşıp konuyu bitiriyorum.