BİLGİ SAYAMIYORUM beta

C++ ile Quicksort algoritması nasıl yazılır, bir vektör/vector üstünde nasıl uygulanır?

0

Sıralama algoritması kullanmanız gereken bir konumdasınız ve Quicksort mantıklı bir tercih gibi geliyorsa ilk önce hatırlatayım:

Quicksort, sıralama algoritmalarının etkili üyelerinden biridir, temel olarak; bir listeyi alıp, tercihen sonundaki sayıdan başlayarak, o sayıyı pivot ilan edip sağına kendinden büyük olanları soluna eşit ve küçük olanları atarak oluşturulur. Bu sağ ve sol listeler içinde de aynı işlem tekrarlanır. Böylece ana liste en küçük haline inildiğinde sıralı hale gelmiş olur. 

Bu yapıyı C++ ile farklı şekillerde sağlayabilirsiniz ancak, genel olarak modelin izlenmesi gerektiği için listeyi parçalara ayırmak, pivotun yerini değiştirmek gibi işlemleri yüksek ihtimalle buradaki gibi yapacaksınız. Tüm kodu bütün olarak buraya yapıştırıyorum, kısım kısım anlatacağım:

     #include "stdafx.h"
     #include <iostream>
     #include <vector>
     using namespace std;

     void quickSort(vector<int>&, int, int);
     int parcalama(vector<int>&, int, int);

     // Kütüphaneleri çağırıyoruz ve ardından 2 fonksiyonun temel olarak ne alıp ne verceğini belirleyen templateleri yazıyoruz. 

     int main(){
          vector<int> Liste = {21,13,4,2,11,30,16,5,17};
          int ilk = 0;
          int son = 9;

          cout << "####### Duzensiz Liste #####d# " << endl;
          for (auto e : Liste){ cout << e << " "; }
          cout << endl;

          quickSort(Liste, ilk, son);
          cout << "####### Duzenli Liste #######" << endl;
          for (auto e : Liste){ cout << e << " ";}
          cout << endl;

          system("pause");
          return 0;
     }

     /* Main fonksiyonu işlem yaptığımız ana zorunlu fonksiyondur. Burada bir liste oluşturuyorum, başlangıç ve bitişinin sayısal değerlerini belirliyorum. "cout" lar ve "for" döngüsü ile orjinal listemi gösteriyorum ve ardından belirlediğim değerler ile quicksort fonksiyonunu çalıştırıp, değişmiş listeyi gösteriyorum. Tüm işlemler bitince, pencere ile çıktı gösterdiğim için, kapanmak için benden tuş beklesin diye, programı bekletiyorum. */

     void quickSort(vector<int>& Liste, int ilk, int son){
          int r;
          if (ilk<son){
               r = parcalama(Liste, ilk, son);
               quickSort(Liste, ilk, r);
               quickSort(Liste, r + 1, son);
          }
     }

     /* Tabii ki bu fonksiyona ilk ile yollanan değer, son olandan küçükse devam edip listeyi bölünmeye yolluyorum. Bölünmüş listeden gelen yeni sayının sol tarafını ve sağ tarafını ayrı ayrı tekrar quicksort a sokuyorum. */

     int parcalama(vector<int>& Liste, int ilk, int son){
          int x = Liste[ilk];
          int i = ilk;
          int j;

          for (j = ilk + 1; j<son; j++){
               if (Liste[j] <= x){
                    i = i + 1;
                    swap(Liste[i], Liste[j]);
               }
          }
          swap(Liste[i], Liste[son]);
          return i;
     }

     /* Belirlenen sayıyla olan karşılaştırmalarına göre yerlerini değiştiriyorum. Pivotu sonuç olarak döndürüyorum ki yeni listeleri oluşturacak nokta o olsun. */

Eğer anlamakta güçlük çektiyseniz ve Quicksort ile ilgili daha önce detaylı bilgi edinmediyseniz, önce aşağıdaki linkler ile konuda araştırma yapmanızı tavsiye ederim:

BENZER 7

Kimse etkileşime girmemiş

ETİKETLER