İçeriğe atla

Hızlı sıralama

Hızlı sıralama
Hızlı sıralama'nın uygulanması sırasındaki davranışı. Yatay çizgiler seçilen pivot elemanları gösterir.
SınıfSıralama algoritması
Veri yapısıDeğişken
Zaman karmaşıklığıOrtalama O(n log n)
En iyiAra sıra
Alan karmaşıklığıUygulamaya göre değişken

Hızlı sıralama (İngilizcesi: Quicksort), günümüzde yaygın olarak kullanılan bir sıralama algoritmasıdır. Hızlı sıralama algoritması n adet sayıyı, ortalama bir durumda, karmaşıklığıyla, en kötü durumda ise karmaşıklığıyla sıralar. Algoritmanın karmaşıklığı aynı zamanda yapılan karşılaştırma sayısına eşittir.

Tarihi

Hızlı sıralama algoritması 1960 yılında küçük bir İngiliz şirketi olan Elliot Brothers'ta çalışan C. A. R. Hoare tarafından geliştirilmiştir.[1]

Algoritma

Hızlı sıralama algoritması, sıralanacak bir sayı dizisini daha küçük iki parçaya ayırıp oluşan bu küçük parçaların kendi içinde sıralanması mantığıyla çalışır.

Algoritmanın adımları aşağıdaki gibidir:

  1. Sayı dizisinden herhangi bir sayıyı pivot eleman olarak seç.
  2. Sayı dizisini pivottan küçük olan tüm sayılar pivotun önüne, pivottan büyük olan tüm sayılar pivotun arkasına gelecek biçimde düzenle (pivota eşit olan sayılar her iki yana da geçebilir). Bu bölümlendirme işleminden sonra eleman sıralanmış son dizide olması gerektiği yere gelir. Algoritmanın bu aşamasına bölümlendirme aşaması denir.
  3. Pivotun sol ve sağ yanında olmak üzere oluşan iki ayrı küçük sayı dizisi, hızlı sıralama algoritması bu küçük parçalar üzerinde yeniden özyineli olarak çağrılarak sıralanır.

Algoritma içinde sayı kalmayan (eleman sayısı sıfır olan) bir alt diziye ulaştığında bu dizinin sıralı olduğunu varsayar.

Örnek

Algoritma

TEKRARLA
    Ara index_sol için
       sortFeld[index_sol] ≥ sortFeld[Pivot]
    Ara index_sağ için
       sortFeld[index_sağ] ≤ sortFeld[Pivot] 
    EĞER  index_sol ve index_sağ  bulundu ise
       SONRA Değiştir
           sortFeld[index_sol] ile sortFeld[index_sağ]
       YOKSA
           Bir element kaydır
    SON EĞER
Koşul tamamlanıncaya kadar

Üstteki algoritmaya göre asagidaki örnek :

SORTIERBEISPIEL

1 - Pivot(karşılaştırma) elementini bulmak için :

İlk önce harfler sayılır. Eger toplam tek ise (1) ekleyip ikiye bölünür. (15 + 1) / 2 = 8
                                    toplam çift ise ikiye bölünür.

2 - Bu durumda Pivot element B oluyor. SORTIER B EISPIEL

Burada ilk harf olan 'S' son harf olan 'L' ve orta harf olan 'B' karşılaştırılır. 
İçlerinde ortanca olan değer her zaman orta değerdir.

Yani örnek şu şekle dönüşür : SORTIER L EISPIEB

3 - Yukarıdaki algoritma göz önünde bulundurulursa;

   Kontrol ediliyor : Soldaki element(S) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(B) Pivot(L) den küçük mü? (Evet )

Eğer iki koşul da doğru ise ilk element(S) ile son element(B) yer değiştirilir. (BORTIER L EISPIES) (Algoritmaya göre sadece ikisi 'evet' ise değişim gerçekleşir)

                      Soldaki element(O) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(E) Pivot(L) den küçük mü? (Evet )

Eğer iki koşul da doğru ise ilk element(O) ile son element(E) yer değiştirilir. (BERTIER L EISPIOS)

                      Soldaki element(R) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(I) Pivot(L) den küçük mü? (Evet )

Eğer iki koşul da doğru ise ilk element(R) ile son element(I) yer değiştirilir. (BEITIER L EISPROS)

                      Soldaki element(T) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(P) Pivot(L) den küçük mü? (Hayır )

Eğer bir koşul yanlış ise soldaki element(T) sabit kalıyor, sağdaki element(P) yi direkt sağa yazılır. (BEIIER L EISPROS) (DİKKAT : 'T' algoritmaya şu an dahil değil, ta ki ikisi de 'evet' oluncaya kadar)

                      Soldaki element(T) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(S) Pivot(L) den küçük mü? (Hayır )

Eğer bir koşul yanlış ise soldaki element(T) sabit kalıyor, sağdaki element(S) yi direkt sağa yazılır. (BEIIER L EISPROS)

                      Soldaki element(T) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(I) Pivot(L) den küçük mü? (Evet )

Eğer iki koşul da doğru ise element(T) ile element(I) yer değiştirilir. (BEIIIER L ETSPROS) (Şimdi 'T' yazılabilir, ikisi de evet)

                      Soldaki element(E) Pivot(L) den büyük mü? (Hayır )
                      Sağdaki element(E) Pivot(L) den küçük mü? (Evet )

Eğer bir koşul yanlış ise soldaki element(E) sola yazılır, sağdaki element(E) sabit kalıyor (BEIIIER L ETSPROS)

                      Soldaki element(R) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(E) Pivot(L) den küçük mü? (Evet )

Eğer bir koşul da doğru ise soldaki element(R) ile sağdaki element(E) sabit kalıyor (BEIIIEE L RTSPROS)

Son aşama

                      Soldaki element(R) Pivot(L) den büyük mü? (Evet )
                      Sağdaki element(E) Pivot(L) den küçük mü? (Evet )

Eğer bir koşul yanlış ise soldaki element(R) sola yazılır, sağdaki element(E) sabit kalıyor (BEIIIEE L RTSPROS)

B - E - I - I - I - E - E - L - R - T - S - P - R - O - S

Aynı işlemleri sağdaki ve soldaki bölümlere ayrı ayrı yapılır.

Sonuç şöyle :

B E E E I I I L O P R R S S T

Sözde Kodu

Algoritmanın yalın bir sözde kod olarak gösterimi aşağıdaki gibidir:

 function quicksort(array)
     var list less, equal, greater
     if length(array) ≤ 1  
         return array  
     select a pivot value pivot from array
     for each x in array
         if x < pivot then append x to less
         if x = pivot then append x to equal
         if x > pivot then append x to greater
     return concatenate(quicksort(less), equal, quicksort(greater))

Diğer Sıralama Algoritmaları

Kaynakça

  1. ^ "Timeline of Computer History: 1960". Computer History Museum. 21 Haziran 2015 tarihinde kaynağından arşivlendi. 

Kaynakça

  • Hoare, C. A. R. "Partition: Algorithm 63," "Quicksort: Algorithm 64," and "Find: Algorithm 65." Comm. ACM 4(7), 321-322, 1961
  • Brian C. Dean, "A Simple Expected Running Time Analysis for Randomized 'Divide and Conquer' Algorithms." Discrete Applied Mathematics 154(1): 1-5. 2006.
  • R. Sedgewick. Implementing quicksort programs, Comm. ACM, 21(10):847-857, 1978.
  • David Musser. Introspective Sorting and Selection Algorithms, Software Practice and Experience vol 27, number 8, pages 983-993, 1997
  • Donald Knuth. The Art of Computer Programming, Volume 3: Sorting and Searching, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89685-0. Pages 113–122 of section 5.2.2: Sorting by Exchanging.
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press ve McGraw-Hill, 2001. ISBN 0-262-03293-7. Chapter 7: Quicksort, pp. 145–164.
  • A. LaMarca and R. E. Ladner. "The Influence of Caches on the Performance of Sorting." Proceedings of the Eighth Annual ACM-SIAM Symposium on Discrete Algorithms, 1997. pp. 370–379.
  • Faron Moller. Analysis of Quicksort 30 Eylül 2007 tarihinde Wayback Machine sitesinde arşivlendi.. CS 332: Designing Algorithms. Department of Computer Science, University of Wales Swansea.
  • Steven Skiena. Lecture 5 - quicksort. CSE 373/548 - Analysis of Algorithms. Department of Computer Science. State University of New York at Stony Brook.
  • Conrado Martínez and Salvador Roura, Optimal sampling strategies in quicksort and quickselect. SIAM J. Computing 31(3):683-705, 2001.
  • Jon L. Bentley and M. Douglas McIlroy, "Engineering a Sort Function, SOFTWARE---PRACTICE AND EXPERIENCE, VOL. 23(11), 1249–1265, 1993

Dış bağlantılar

İlgili Araştırma Makaleleri

Aşağıdaki tarihsel sıralama genel olarak algoritmaların ilk kökenlerinden başlayarak gelişimlerini ana hatlarıyla gösterir.

<span class="mw-page-title-main">PageRank</span>

PageRank, Google tarafından geliştirilen ve web sayfalarının önemini belirlemek için kullanılan bir algoritmadır. İnternet üzerindeki bağlantıların analiz edilmesiyle hesaplanan Pagerank değeri Google Arama sonuçlarında sayfaların sıralanması için kullanılan faktörlerden biridir.

<span class="mw-page-title-main">Birleştirmeli sıralama</span>

Birleşmeli Sıralama, bilgisayar bilimlerinde derecesinde karmaşıklığa sahip bir sıralama algoritmasıdır. Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma yöntemi kullanarak diziyi sıralar.

<span class="mw-page-title-main">Sıralama algoritması</span>

Sıralama algoritması, bilgisayar bilimlerinde ya da matematikte kullanılan, verilen bir listenin elemanlarını belirli bir sıraya sokan algoritmadır. En çok kullanılan sıralama türleri, sayı büyüklüğüne göre sıralama ve alfabetik sıralamadır. Sıralama işleminin verimli yapılması, arama ve birleştirme algoritmaları gibi çalışması için sıralanmış dizilere gereksinim duyan algoritmaların başarımının yüksek olması için önemlidir. Sıralama algoritmaları bilgisayarlarda tutulan verilerin düzenlenmesini ve insan kullanıcı tarafından daha rahat algılanmasını da sağlar.

<span class="mw-page-title-main">Hızlı Fourier dönüşümü</span>

Hızlı Fourier dönüşümü bir dizinin ayrık Fourier dönüşümünü (DFT) ya da ters ayrık dönüşümünü hesaplayan bir algoritmadır. Fourier analizinde bir sinyal bulunduğu uzaydaki gösteriminden frekans uzayıki gösterimine ya da tersine dönüştürülür. DFT'de ise ayrık veri dizileri farklı frekans öğelerine ayrılır. Bu operasyon her ne kadar birçok alanda kullanışlı olsa da, doğrudan formüllerle hesabı hızlı ve pratik değildir; bu nedenle DFT hesabı için FFT algoritmaları kullanılmaktadır.

<span class="mw-page-title-main">Seçmeli sıralama</span>

Seçmeli Sıralama, bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Karmaşıklığı olduğu için büyük listeler üzerinde kullanıldığında verim sağlamaz ve genel olarak benzeri olan eklemeli sıralamadan daha başarısızdır. Seçmeli sıralama yalın olduğu ve bazı durumlarda daha karmaşık olan algoritmalardan daha iyi sonuç verdiği için tercih edilebilir.

Çarpma algoritmaları, çarpma işlemi için gereken sonlu işlemler kümesidir. Çarpma işlemi, aritmetik işlemlerinde sık kullanılan ve bilimsel uygulamalarda önemli rolü olan, temeli aslında toplama ve kaydırma işlemlerine dayanan aritmetiksel bir işlemdir. Toplama işleminden daha karmaşıktır ve daha çok zaman alır aynı zamanda daha çok alan gerektirir.

<span class="mw-page-title-main">Yığın sıralaması</span>

Yığın Sıralaması, bilgisayar bilimlerinde kullanılan karşılaştırmaya dayalı bir sıralama algoritmasıdır. Uygulamada pek çok bilgisayarda hızlı sıralama algoritmasından daha yavaş çalışsa da en kötü durumda O(n log n) çalışma süresi vardır. Yığın sıralaması diziyi yerinde sıralar ancak kararlı bir sıralama algoritması değildir.

<span class="mw-page-title-main">Eklemeli sıralama</span> sıralama algoritma

Eklemeli Sıralama, bilgisayar bilimlerinde kullanılan ve sıralı diziyi her adımda öğe öğe oluşturan bir sıralama algoritmasıdır. Büyük dizilerle çalışıldığında hızlı sıralama, birleştirmeli sıralama ve yığın sıralaması gibi daha gelişmiş sıralama algoritmalarından daha verimsiz çalışır. Ancak buna karşın bazı artıları da vardır:

Kütüphane Sıralaması ya da diğer bir deyişle aralıklı eklemeli sıralama, eklemeli sıralama algoritmasını art arda yapılan eklemeleri dizideki boşlukları kullanıp hızlandırarak kullanan bir sıralama algoritmasıdır. Adının kütüphane sıralaması olması bir benzetmeden gelmektedir:

Bir kütüphane görevlisinin bir raftaki bütün kitapları A harfiyle başlayanlar sol tarafta kalarak sağa doğru kitapların arasında boşluk kalmayacak biçimde alfabetik sıraya dizmek istediğini varsayalım. Eğer görevli B bölümüne ait yeni bir kitabı yerleştirmek isterse kitabın yerini B alanında bulduktan sonra yeni kitaba yer açmak için ilgili kitaptan sonraki bütün kitapları sağa kaydırması gerekir. Bu bir eklemeli sıralamadır. Ancak, eğer görvli daha önce her bir harften sonra belirli bir boşluk bırakmış olsaydı, yalnızca B harfindeki kitapların yarısını hareket ettirerek bu sıralamayı sağlayabilirdi. Kütüphane sıralamasının ana ilkesi budur.

Tarak Sıralaması, ilk defa 1991 yılının Nisan ayında Stephen Lacey ve Richard Box tarafından Byte dergisinde duyurulmuş yalın bir sıralama algoritmasıdır. Kendisinden önce duyurulmuş kabarcık sıralaması algoritmasından başarılıdır ve karmaşıklıkta hızlı sıralama algoritmasıyla yarışır. Algoritmanın ana fikri listenin sonundaki küçük değerli öğelerin sayısını azaltmaktır. Kabarcık sıralaması algoritmasında sıralanacak listenin sonundaki küçük değerli öğelerin varlığı algoritmayı çok yavaşlattığı için tarak sıralamasında bu değerlerin sayısının azaltılması yoluna gidilmiştir.

Sayarak sıralama bilgisayar bilimlerinde kullanılan ve kova sıralaması gibi sıralanacak dizinin içindeki değerlerin aralığının bilinmesi durumunda kullanılabilen bir sıralama algoritmasıdır. Sayarak sıralama algoritması dizideki değerlerin aralık bilgilerini yeni bir dizi oluşturmak için kullanır. Oluşturulan yeni dizinin her bir satırı ana dizide o satır numarasının değerine sahip ögelerin sayısını gösterir. Yeni dizideki öge değeri sayıları daha sonra ana dizideki tüm değerlerin doğru konuma konulması için kullanılır. Sayarak sıralama algoritması güvercin yuvası sıralamasından daha verimsiz bir algoritmadır.

<span class="mw-page-title-main">Basamağa göre sıralama</span> bilgisayar bilimlerinde sayıları basamaklarının üzerinde işlem yaparak sıralayan bir algoritma

Basamağa göre sıralama bilgisayar bilimlerinde sayıları basamaklarının üzerinde işlem yaparak sıralayan bir sıralama algoritmasıdır. Sayma sayıları adlar ya da tarihler gibi karakter dizilerini göstermek için kullanılabildiği için basamağa göre sıralama algoritması yalnızca sayma sayılarını sıralamak için kullanılan bir algoritma değildir.

Dizi eşleme algoritmaları olarak da adlandırılan dizi arama algoritmaları, bir ya da birkaç dizinin (örüntü) daha büyük bir dizi ya da metin içindeki yerinin bulunmasını konu edinen önemli bir dizi algoritması sınıfıdır.

Pivot ya da pivot element algoritmaların bir matris, dizi veya bir tür sonlu küme içinden, bir hesaplamada kullanılmak üzere seçtiği ilk elemandır. Matris algoritmaları için pivotun en azından sıfırdan farklı olması istenir ve genellikle sıfırdan uzak bir değer seçilir. Bu durumda algoritmanın düzgün çalışması için uygun pivot seçiminde satır veya sütunlar aralarında yer değiştirtilebilir.

Arama algoritmaları, bilgisayar biliminde seçili özelliklere göre istenilen bilgileri bulan algoritmalardır. Listeler, metinler ve şekiller üzerinde çalışırlar.

Sayı teorisinde, asal çarpanlara ayırma bir bileşik sayının, çarpıldıklarında yine aynı sayıyı verecek şekilde, bir ve kendisi dışındaki bölenlerine ayrılmasıdır.

Matematikte, özellikle soyut cebir ve uygulamalarında, ayrık logaritma, genel logaritmanın grup kuramındaki karşılığıdır. Genel olarak bakıldığında, loga(b) ifadesi, ax = b ifadesinin gerçel sayılar kümesi içindeki çözümlerine karşılık gelir. Benzer olarak, g ve h sonlu devirli grup G'nin elemanları olduğunda, gx = h ifadesinin çözümü olan x sonuçlarına h'nin g tabanındaki ayrık logaritması denir.

Bilgisayar bilimi, matematik, ekonomi ve biyoinformatikte dinamik programlama karmaşık bir problemi tekrarlanan alt problemlere bölerek, her bir alt problemi yalnız bir kere çözüp daha sonra bu çözümü kaydederek karmaşık problemin çözümünde kullanma yöntemidir. Bir alt problem çözüldükten sonra tekrar çözülmesi gerektiğinde daha önce kaydedilen çözüm kullanılarak zaman kazanılır, ancak alt problemlerin kaydedileceği daha fazla alana gereksinim duyulur. Yani dinamik programlama algoritmaları alandan ödün verilerek zamandan kazanılmasını sağlar. Dinamik programlama algoritmaları optimizasyon problemlerinin çözümünde yaygın olarak kullanılır.

Kriptografide, scrypt, Colin Percival tarafından Tarsnap çevrimiçi yedekleme hizmeti için oluşturulan bir parola tabanlı anahtar türetme fonksiyonudur. Bu algoritma, büyük miktarda bellek gerektirerek büyük ölçekli özel donanım saldırılarını gerçekleştirmeyi pahalı hale getirmek için özel olarak tasarlanmıştır. 2016 yılında, scrypt algoritması IETF tarafından RFC 7914 olarak yayınlandı. Scrypt algoritmasının, ArtForz kullanıcı adına sahip ve gerçek adı bilinmeyen bir programcı tarafından implemente edilmiş, basitleştirilmiş bir sürümü, önce Tenebrix'te ve ardından Fairbrix ve Litecoin olmak üzere bir dizi kripto para birimi tarafından iş kanıtı şeması olarak kullanıldı.