Turkhackteam.net/org - Turkish Hacking & Security Platform  
Geri git   Turkhackteam.net/org - Turkish Hacking & Security Platform >
Programlama
> C/C++

C/C++ Çok paradigmalı ve çok kullanılan C/C++ dillerinin dökümanlarının paylaşım alanı.



[Dev Konu] Arama ve Sıralama Algoritmaları Birarada (C) //1071

C/C++

Yeni Konu aç Cevapla
 
Seçenekler
Alt 11-07-2018 21:06   #1
  • Binbaşı
  • Üye Bilgileri
Üyelik tarihi
06/2015
Mesajlar
Konular


  
[Dev Konu] Arama ve Sıralama Algoritmaları Birarada (C) //1071



Merhaba arkadaşlar. Bugün arama ve sıralama algoritmalarını C dilinde örneklerle anlatmaya çalışacağım. Umarım faydalı olur.

################################################## ############################################


Arama ve Sıralama Algoritmaları
Arama ve sıralama algoritmaları ilk başta basit görünse de aslında bilişim alanının önemli bir parçasıdır. Çünkü bir veri dizisinin belirli bir sıraya göre saklanması veya gerektiğinde verinin bir parçasından tümüne ulaşılması sıklıkla ihtiyaç duyulan işlemlerdendir. Öğrencilerin alfabeye göre sıralanması veya dosya yöneticisindeki verilerin boyutuna göre sıralanması sıralama işlemlerine örnek verilebilir. Dosya yöneticisindeki arama çubuğundan herhangi bir dosyanın aranması ise arama işlemine örnektir. Çok uzatmadan esas konularımıza geçelim.
A-) Arama Algoritmaları

1-) Ardışıl-Doğrusal Arama (Linear Search) Algoritması

En basit arama algoritmasıdır. İlk kayıttan aramaya başlar. İsteğe göre; aranan veri bulununca arama işlemi sonlandırılır veya aranan veriyle eşleşen tüm kayıtları bulmak için son kayıta kadar gidilir.




Aşağıda ardışıl (doğrusal) sıralama için yazdığımız C fonksiyonunu inceleyelim:

Gördüğümüz gibi linearSort isimli fonksiyonumuzda bir döngü kurularak arr isimli sayı dizisinin elemanları tek tek incelenmektedir. Aranan eleman bulunduğunda elemanın indisi , bulunamadığında ise -1 değeri döndürülüyor. Dikkat etmeniz gereken nokta burada aranan eleman bulunuca diğer elemanlara bakılmadan program sonlandırılıyor. Yani eğer aranan elemandan birden fazla varsa yalnızca ilk bulunanın indisi gönderiliyor. Buna birincil anahtar sözcüğe göre arama denir. Eğer tüm elemanlar incelenseydi ikincil anahtar sözcüğe göre arama denilirdi.
Main fonksiyonunun içini incelersek:
8 elemanlı dizi isimli bir sayı dizisi oluşturuluyor. Kullanıcıdan aranacak sayı isteniyor. linearSort fonksiyonumuza dizi isimli dizi gerekli parametreler girilerek gönderiliyor ve sonuç indis isimli değişkenimize atanıyor. Eğer aranan değer bulunmazsa bulunamadı şeklinde uyarı veriyor. Bulunursa kaçıncı indis olduğu yazdırılıyor.




Kod:
#include <stdio.h>


int linearSort(int arr[],int N, int aranan); //parametre olarak sırasıyla dizi, dizinin eleman sayısı,aranan elemanı alan ardışıl sıralama fonksiyonunu bildirdik


int main(int argc, char *argv[]) { //fonksiyonu denemek için basit bir ana program yazalım
    int dizi[] = {10,78,11,25,32,9,30,20};
    int indis,ara;
    printf("Aranan Sayiyi Giriniz: ");
    scanf("%d",&ara);
    indis=linearSort(dizi,8,ara);
    
    if(indis==-1)
        printf("Aranan eleman bulunamadi!");
    else
        printf("Aranan eleman dizinin %d indisli elemanidir",indis);
    
    return 0;
}


int linearSort(int arr[],int N, int aranan){
    int i;
    for(i=0;i<N;i++){ //dizinin boyutu (N) kadar çevrilecek döngü oluşturduk
        if(arr[i]==aranan)
            return i;  // aranan bulununca aranan elemanın dizi içindeki indisi  gönderilir ve döngü sonlanır 
    }
    return -1; //aranan eleman dizide yoksa -1 değeri gönderilir
}
2-) İkili Arama (Binary Search) Algoritması

İkili arama (binary search) algoritması sıralı olan veriler üzerinde işlem yapar. Böl ve fethet (divide and conquere) mantığıyla çalışır. Kayıt sayısı çok fazla olan uygulamalar için idealdir. Çalışma mantığını bir resim yardımıyla anlatalım:





(69 sayısı arandığı varsayılmıştır)
1. Ortadaki sayıyı bulur (45). Otadaki sayı(45) ile aranan sayı(69) karşılaştırılır. 69 büyük olduğu için dizinin sağ tarafına bakılır.

2. Sağ tarafın ortasındaki sayı bulunur(96). 69 küçük olduğu için sol tarafa bakılır.

3. Ortadaki sayı 69’dur. Aranan veri bulunmuş olur.



Şimdi de algoritmayı C dilinde bir fonksiyon olarak yazalım. Gerekli açıklamaları kodlara yorum satırı olarak ekledim. Yeterli olduğunu düşünüyorum.



Kod:
#include <stdio.h>

int binarySearch(int array[],int max, int aranan){ //parametre olarak sırasıyla sayı dizisi, eleman sayısı ve aranan eleman isteyen arama fonksiyonunu bildirdik

    int kucukIndis=0; //dizinin ilk indisi 0 olarak bildirildi
    int buyukIndis=max-1; //büyük indis eleman sayısının bir eksiği olarak bildirildi
    
    while(buyukIndis>=kucukIndis){  //büyük indis büyük olduğu sürece 
        int orta =(buyukIndis+kucukIndis)/2; //orta indis büyük indisle küçük indisin toplamının yarısı
        if(aranan==array[orta]) {  
        return orta; //aranan eleman bulunduysa orta değişkenini döndür.
    }
    
        else if(array[orta]<aranan) kucukIndis=orta+1; // aranan eleman orta değişkeninden büyükse dizinin sağ tarafına bak
      else buyukIndis=orta-1; //değilse sol tarafa bak
    
    }
return -1; //aranan eleman bulunamazsa -1 değerini döndür
}

int main(int argc, char *argv[]) {  

//algoritmayı denemek için bir ana program yazalım

    int arr[]={3,5,6,9,10,15,20,35,69,77,99};
int search;
do {
puts("Aranan elemanı giriniz: ");
scanf("%d",&search);

int indis =binarySearch(arr,11,search);
if(indis==-1) printf("bulunamadi \n");
else printf("aranan %d indisli eleman \n",indis);
}while(1);
    return 0;
}
B-) Sıralama Algoritmaları

1-) Ekleme Sıralama ( Insertion Sort) Algoritması

Sokma sıralama olarak da bilinir. İşlemdeki sayının doğru pozisyona yerleştirilmesi mantığıyla çalışır. Sıralanacak dizinin ilk elemanına dokunulmaz. Diğer elemanlar tek tek işleme sokulur ve uygun yere konulur. Dizi sıralı olan kısım ve sıralanacak kısım olarak iki parça gibi düşünülür. Bu algoritma zaman karmaşıklığı olarak avantajlı değildir. Sıralı dizinin sırasını bozmadan eleman eklemek için idealdir.

Şimdi basit bir örnekle anlamaya çalışalım:


{7,6,4,0,9,8,3,5} insertion sort ile sıralayalım

1. Birinci indisten başlar. Solundaki sayılara bakılır. Eğer soldaki sayı daha büyükse bu sayıyı bir kaydır.

7,6,4,0,9,8,3,5 --> 6,7,4,0,9,8,3,5

(6 sola yerleşir, 7 sağa kayar)

2. İkinci indise geçilir. Solundaki ilk sayı (6) daha büyük olduğu için sağa kayar.

6,7,4,0,9,8,3,5 --> 6,4,7,0,9,8,3,5

Yeni sıralamaya tekrar bakılır. Soldaki sayı (6) yine büyük olduğundan sağa kayar.


6,4,7,0,9,8,3,5--> 4,6,7,0,9,8,3,5
3. Üçüncü indisi (0) inceleyelim. Solundaki sayıların hepsi daha büyük olduğundan hepsi sağa kayar. 0 ise sıfırıncı indise yerleşir.
4,6,7,0,9,8,3,5 --> 0,4,6,7,9,8,3,5
4. Dördüncü indise (9) geçelim. Solundaki elemanların hepsi daha küçük olduğu için yer değiştirme olmaz.

5. Beşinci indise (8) gelelim. Solundaki sayılardan sadece 9 daha büyük. 9’u sağa alalım

0,4,6,7,9,8,3,5 --> 0,4,6,7,8,9,3,5
6. Altıncı indisimizdeki sayı 3 . Solundaki sayılara bakalım. Kendisinden büyük olanları sağa kaydıralım.
0,4,6,7,8,9,3,5 --> 0,3,4,6,7,8,9,5
7. Yedinci indise (5) bakalım. Solundaki sayılardan büyük olanları birer adım sağa alalım.
0,3,4,6,7,8,9,5 --> 0,3,4,5,6,7,8,9
Şimdi de yukarıda yaptıklarımızın kaba kodunu (pseudo kod) yazalım:
1- Birinci indisten başlayarak sol tarafına bak
2- Solundaki sayı daha büyükse sağa kaydır
3- Kendisinden küçük sayı bulunca boş indise yerleştir
4- Diğer indise geç


Sanırım yeterince açıklayıcı olmuştur. Gerçek kodlara geçelim:

Kod:
#include <stdio.h> int insertionSort(int dizi[],int N); //parametre olarak sırasıyla sayı dizisi ve dizinin eleman sayısını alan sıralama fonksiyonumuzu bildirdik **** printArr(int dizi[],int N); //sıralanmış diziyi yazdırmak için fonksiyon bildirdik int main(int argc, char *argv[]) { //algoritmayı denemek için basit bir ana program yazalım int arr[]={3,6,9,7,5}; insertionSort(arr,5); printArr(arr,5); } int insertionSort(int dizi[],int N){ int i,j,ekle; for(i=1;i<N;i++){ //i ,eleman sayısından küçük olduğu sürece ekle=dizi[i]; for(j=i-1;j>=0 && ekle<=dizi[j];i--){ //i'den önceki indis 0'dan büyük ve i'inci eleman j'inci elemandan küçük veya eşit olduğu sürece dizi[j+1]=dizi[j]; j=j-1; } //sağa kaydır dizi[j+1]=ekle; } } **** printArr(int dizi[],int N){ //dizi yazdırma fonksiyonu int i; for(i=0;i<N;i++){ printf("%d\n",dizi[i]); } }
2-) Seçmeli Sıralama ( Selection Sort) Algoritması


Bu algoritmada dizinin başından veya sonundan başlanır. Başından başlandığını varsayarak çalışma mantığını yazalım. İlk eleman ele alınır ve kendisi dahil olmak üzere en küçük eleman aranır. En küçük eleman bulunuca kendisiyle (ilk elemanla) yer değiştirilir. Ardından ikinci eleman ele alınır. İkinci küçük eleman aranır ve bulununca yer değiştirilir. Aynı işlem son elemana kadar devam ettirilir.
Şimdi de algoritmamızın yalancı (kaba) kodunu yazalım:
1- İlk sayıdan başla ve sayıyı elde tut
2- Tutulan sayının sağındaki en küçük sayıyı bul
3- Tutulan sayıyla en küçük sayıyı yer değiştir
4- Bir sağdaki sayıya geç
Gerçek kodlara geçelim:
Kod:
#include <stdio.h> **** selectionSort(int dizi[], int N); //seçmeli sıralama fnksiyonunu bildirdik. Parametre olarak sırayla dizi ve dizinin eleman sayısı istendi **** printDizi(int dizi[],int N); //sıralı diziyi yazdırmak için fonksiyon bildirdik int main(){ //denemek için basit bir ana program int array[]={1,10,32,65,23,45,85,2,15,63,100}; selectionSort(array,11); printDizi(array,11); scanf(""); return 0; } **** selectionSort(int dizi[], int N){ int i,j,enKucuk,index; for(i=0;i<(N-1);i++){ //Son elemana gelene kadar döndür enKucuk=dizi[N-1]; index=N-1; for(j=i;j<(N-1);j++){ if(dizi[j]<enKucuk){ //gezilen eleman tutulandan küçükse yer değiştir enKucuk=dizi[j]; index=j; } } dizi[index]=dizi[i]; dizi[i]=enKucuk; } } **** printDizi(int dizi[],int N){ int i; for(i=0;i<N;i++) printf("%d - ",dizi[i]); }
3-) Kabarcık Sıralama ( Bubble Sort)

En çok bilinen sıralama algoritmalarındandır. Sıralanacak elemanlar üzerinde bir yönde ilerlenirken komşu iki elemanın istenilen kurala göre sıralanacak şekilde yer değiştirmesi mantığıyla çalışır. Bu yer değiştirme işlemi sıralama tamamlanana kadar devam eder.

Bu işlemi yapmak için iki döngü kullanılır. Birinci döngü elemanlar üzerinde gezmemizi sağlarken diğeri oturmayan elemanlardan devam edilmesini sağlar.

Zaman karmaşıklığının fazla olması dezavantajdır. Avantajı ise tasarımının basit olmasıdır. Eleman sayısı az olan verilerde kullanılabilir.

Şimdi algoritmanın C koduna geçelim:


Kod:
#include <stdio.h> #include <stdlib.h> **** kabarcikSirala(int array[],int N){ //Parametre olarak dizi ve dizinin eleman sayısı isteyen fonksiyonumuz int i,j,temp; for(i=N-1;i>0;i--) { for(j=0;j<N;j++) { if (array[j]>array[j+1]){ //komşu elemanları karşılaştırır ve gerekirse yer değiştirir temp = array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } } int main(int argc, char *argv[]) { //deneyelim int dizi[]={3,2,6,7,5,13,1}; kabarcikSirala(dizi,7); int k; for(k=0;k<7;k++) printf("%d - ",dizi[k]); return 0; }
4-) Birleşmeli Sıralama ( Merge Sort) Algoritması


Böl ve fethet mantığıyla çalışan merge sort rekürsif çalışan bir algoritmadır. Sıralanmak istenen topluluk önce sağ ve sol olmak üzere iki alt kümeye ayrılır. Alt kümelerdeki eleman sayısı 1 oluncaya kadar bu işlem devam eder. Alt kümelerde 1 eleman kalınca elemanlar sıralı olarak rekürsif çağrımla birleştirme işlemi başlar. Algoritmaya adını veren de bu birleştirme işlemidir. Aşağıdaki resmi inceleyince ne demek istediğimi daha iyi anlayacaksınız.





Algoritmanın C kodunu yazalım:


Kod:
#include <stdio.h> **** merge(int dizi[],int l,int m,int r); //parametre olarak sırasıyla dizi,dizinin sol indisi,orta indisi ve sağ indisini alan esas fonksiyonumuz **** mergeSort(int dizi[],int l,int r); //yardımcı fonksiyonumuz **** yazDizi(int arr[],int N); //dizi yazdırma fonksiyonumuz int main(int argc, char *argv[]) { //deneyelim int array[]={33,25,6,98,20,23,35,2,65,39}; mergeSort(array,0,9); yazDizi(array,10); return 0; } **** merge(int dizi[],int l,int m,int r){ int i,j,k; int sol = m-l+1; //sol dizi boyutu için değişken int sag=r-m; //sağ dizi boyutu için değişken int L[sol]; //geçici dizilerimiz int R[sag]; for(i=0;i<sol;i++) //geçici dizilere eleman atar L[i]=dizi[l+i]; for(j=0;j<sag;j++) R[j]=dizi[m+1+j]; i=0,j=0,k=l; while(i<sol && j<sag){ //sol ve sağ dizide eleman oldukça döngü devam edecek döngü if(L[i]<=R[j]){ //sol dizinin i. elemanı sağ dizinin j. elemanından küçük eşitse dizi[k]=L[i]; //yeni dizinin ilk elemanı sol dizinin ilk elemanı olur i++; } else{ dizi[k]=R[j]; //değilse sağ dizinin ilk elemanı yeni dizinin ilk elemanı j++; } k++; } while(i<sol){ //sol dizide boşta eleman kaldıysa boş kalan yerlere yerleştir dizi[k]=L[i]; i++; k++; } while(j<sag){ //dizide boşta eleman kaldıysa boş kalan yerlere yerleştir dizi[k]=R[j]; j++; k++; } } **** mergeSort(int dizi[],int l,int r){ if(l<r){ int m=l+(r-l)/2; //dizinin ortası mergeSort(dizi,l,m); mergeSort(dizi,m+1,r); merge(dizi,l,m,r); //esas fonksiyona gerekli parametreleri gönderiyoruz } } **** yazDizi(int dizi[],int N){ int a; for(a=0;a<N;a++) printf(" %d \n",dizi[a]); }
5-) Hızlı Sıralama ( Quick Sort) Algoritması
Anlatacağım son algoritma olan hızlı sıralama algoritması da tıpkı merge sort gibi böl ve yönet(fethet) mantığıyla çalışır. Sıralanmak istenen dizi bir sınır değerine (pivot) göre ikiye bölünür. Pivottan küçük olanlar bir tarafa, büyük olanlar diğer tarafa toplanır. Ardından tekrar tekrar hızlı sıralama algoritması kullanarak (buradan rekürsif çalıştığını anlıyoruz) dizi sıralanır.
Algoritmanın C kodu:


Kod:
#include <stdio.h> #include <stdlib.h> int quickSort(int array[],int l,int r); //parametre olarak sırayla dizi,sol indis ve sağ indis alan esas fonksiyonumuz int printArray(int array[],int N); //dizi yazdırma fonksiyonumuz int main(int argc, char *argv[]) { //deneme int dizi[]={3,5,6,7,1,8,0,2,4}; quickSort(dizi,0,8); printArray(dizi,9); return 0; } int quickSort(int array[],int l,int r){ int i=l, j=r, temp; int pivot = array[(l+r)/2]; //ortadaki indisi pivot olarak seçtik while(i<=j){ while(array[i]<pivot) i++; while(array[j]>pivot) j--; if(i<=j){ temp=array[i]; array[i]=array[j]; array[j]=temp; i++; j--; } } if(l<j) quickSort(array,l,j); if(i<r) quickSort(array,i,r); } int printArray(int array[],int N){ int a; for(a=0;a<N;a++) printf("%d - ",array[a]); }


Konuyu pdf olarak indirmek isterseniz: Dosya.tc - Ücretsiz, Hızlı ve Kolay Dosya Paylaşımı


Not: Sansürlü yerler v-o-i-d olacak. Fırsat bulunca kodları github'a yükleyip linkini paylaşacağım.

Not2: Bir teşekkürü çok görmeyin (Ayıptır söylemesi saat sabah 10'dan beri bununla uğraşıyorum)





Kodların github adresi: https://github.com/1071malazgirt/sea...oritmalari.git

    


___________________________________________

Ben Ezelden Beridir Hür Yaşadım Hür Yaşarım
Hangi Çılgın Bana Zincir Vuracakmış Şaşarım


Konu 1071malazgirt tarafından (12-07-2018 11:16 Saat 11:16 ) değiştirilmiştir..
 Offline  
 
Alıntı ile Cevapla
Alt 11-07-2018 21:06   #2
  • Tamamen Forumdan Uzaklaştırıldı
  • Üye Bilgileri
Üyelik tarihi
08/2017
Nereden
Russia
Yaş
19
Mesajlar
Konular


  


Ellerinize Sağlık Hocamda Yazıları Büyütebilirmisiniz Sıkıntı Yaratacakta
    
 Offline  
 
Alıntı ile Cevapla
Alt 11-07-2018 21:09   #3
  • Binbaşı
  • Üye Bilgileri
Üyelik tarihi
06/2015
Mesajlar
Konular


  


Alıntı:
jGozluk´isimli üyeden Alıntı Mesajı göster
Ellerinize Sağlık Hocamda Yazıları Büyütebilirmisiniz Sıkıntı Yaratacakta
hemen ayarlıyorum resimleri ve yazıyı bir hata oldu


// Düzeltilmiştir
    


___________________________________________

Ben Ezelden Beridir Hür Yaşadım Hür Yaşarım
Hangi Çılgın Bana Zincir Vuracakmış Şaşarım


Konu 1071malazgirt tarafından (11-07-2018 21:17 Saat 21:17 ) değiştirilmiştir..
 Offline  
 
Alıntı ile Cevapla
Alt 11-07-2018 21:39   #4
  • Yüzbaşı
  • Üye Bilgileri
Üyelik tarihi
01/2018
Nereden
VideoTasarım
Mesajlar
Konular


  


Ellerinize Sağlık Hocam
    


___________________________________________


Milletimiz her güçlük ve zorluk karşısında, durmadan ilerlemekte ve yükselmektedir. Büyük Türk Milletinin bu yoldaki hızını, her vasıtayla arttırmaya çalışmak, bizim hepimizin en kutlu vazifemizdir.
Atatürk
 Offline  
 
Alıntı ile Cevapla
Alt 11-07-2018 23:11   #5
  • Kıdemli Orgeneral
  • Üye Bilgileri
Üyelik tarihi
12/2013
Mesajlar
Konular


  


Emeğinize sağlık.
    


___________________________________________

Kolaylaştırınız, güçleştirmeyiniz, müjdeleyiniz, nefret ettirmeyiniz.
HZ.MUHAMMED MUSTAFA (S.A.V)

 Offline  
 
Alıntı ile Cevapla
Alt 11-07-2018 23:21   #6
  • Binbaşı
  • Üye Bilgileri
Üyelik tarihi
06/2015
Mesajlar
Konular


  


emek var
    
 Offline  
 
Alıntı ile Cevapla
Alt 12-07-2018 11:18   #7
  • Binbaşı
  • Üye Bilgileri
Üyelik tarihi
06/2015
Mesajlar
Konular


  


Alıntı:
TeamRound´isimli üyeden Alıntı Mesajı göster
Ellerinize Sağlık Hocam
teşekkürler hocam


Alıntı:
kenzai´isimli üyeden Alıntı Mesajı göster
Emeğinize sağlık.

teşekkürler komutanım



Alıntı:
byislam´isimli üyeden Alıntı Mesajı göster
emek var

teşekkkürler hocam




//kodların github adresi konuya eklenmiştir
    


___________________________________________

Ben Ezelden Beridir Hür Yaşadım Hür Yaşarım
Hangi Çılgın Bana Zincir Vuracakmış Şaşarım

 Offline  
 
Alıntı ile Cevapla
Cevapla

Bookmarks

Seçenekler


Bilgilendirme Turkhackteam.net/org
Sitemizde yer alan konular üyelerimiz tarafından paylaşılmaktadır.
Bu konular yasalara uygunluk ve telif hakkı konusunda yönetimimiz tarafından kontrol edilse de, gözden kaçabilen içerikler yer alabilmektedir.
Bu tür konuları turkhackteamiletisim [at] gmail.com mail adresimize bildirebilirsiniz, konular hakkında en kısa sürede gerekli işlemler yapılacaktır.
Please Report Abuse, DMCA, Harassment, Scamming, Warez, Crack, Divx, Mp3 or any Illegal Activity to turkhackteamiletisim [at] gmail.com

Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz.
Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.



         

Powered by vBulletin® Copyright ©2000 - 2018

TSK Mehmetçik Vakfı

Türk Polis Teşkilatını Güçlendirme Vakfı

Google+
film izle

wau

Search Engine Friendly URLs by vBSEO 3.6.0 ©2011, Crawlability, Inc.