Bu algoritma için hiçbir şey yapmadım ve benim adım algoritma adına geçmemeli. ---- Hill (kabuk sıralama yazarı)
Hill, tasarımcısı Hill'e (Donald Shell) göre sıralandı Algoritmadan sonra isimlendirildi 1959'da duyuruldu . Marlene Metzner Norton'un adını içeren Shell-Metzner algoritması olarak adlandırılan bazı eski ders kitapları ve referans kılavuzları, Ancak Metzner'e göre, "Bu algoritma için hiçbir şey yapmadım ve benim adım algoritma adına görünmemeli."
---- O zamanlar ünlüler çok mütevazıydı.
İlk. Tanım
Tepe sıralaması , Artımlı sıralama algoritmasının azaltılması olarak da bilinir, Ekleme sıralaması Daha verimli ve geliştirilmiş. Tepe sıralama, kararsız bir sıralama algoritmasıdır.
Tepe sıralaması, Ekleme sıralaması Aşağıdaki iki özellikten İyileştirilmiş yöntem **:
1. Ekleme sıralaması, neredeyse sıralanmış veriler üzerinde çalışırken oldukça etkilidir, yani doğrusal sıralamanın verimliliğini sağlayabilir
2. Ancak, ekleme sıralaması genellikle verimsizdir, çünkü eklemeli sıralama verileri bir seferde yalnızca bir bit taşıyabilir.
İkinci: Ekleme sıralaması
Bahsedildiğinden beri Ekleme sıralaması , Önce ekleme sıralamayı öğrenelim; şu şekilde çalışır: Sıralı bir sıra oluşturarak, sıralanmamış veriler için, karşılık gelen konumu bulmak ve eklemek için sıralı sırayla arkadan öne doğru tarayın.
Bir resmin bin kelimeye bedel olduğunu söylemek için, anlaşılması en kolay olduğunu düşündüğüm bir resim:
Wikipedia-Ekleme Sıralamasından
Yukarıdaki resmi açıklayın:
1. İlk öğeden başlayarak, öğenin sıralanmış olduğu düşünülebilir;
2. Bir sonraki öğeyi çıkarın ve bir öncekinden büyük veya ona eşit sayıyı bulana kadar önceki öğeyle karşılaştırın, durun ve ardından karşılaştırmadan sonra sayıyı taşıyın;
3. Yeni elemanı bu konuma yerleştirin,
Doğrudan OC koduna gidin ve ardından Hill sıralamasıyla github'a yerleştirilecektir:
/ **
* Ekleme sıralaması
* / - (void) algoritması_InsertSortWith: (NSMutableArray *) array {
// İlk sayıyı kıyaslama olarak düşünün, bu yüzden 1'den başlıyorum
for (int i = 1; i < array.count; i ++) {// Bulunacak numara
int temp =; // Son konumlanan sayının önceki basamağından her seferinde karşılaştırın ve uygun bir konum bulana kadar ileriye bakmaya devam edin < Önceki sayıdan büyük veya ona eşit > ,
for (int j = i-1; j > = 0 sıcaklık < ; j -) {// Kalifiye olmayan tüm numaralar geriye taşınır
array = array; // Son olarak nitelenmiş sayının konumunu belirleyin
dizi =;
}
}
NSLog (@ "Sıralanan dizi:% @", dizi);
}
Üçüncü. Analiz
Hill sıralamasının nedeni hakkında konuşalım.
1. Ekleme sıralaması, neredeyse sıralanmış olan veriler üzerinde çalışırken oldukça etkilidir, yani doğrusal sıralamanın verimliliğini sağlayabilir;
2. Ancak, ekleme sıralaması genellikle verimsizdir, çünkü eklemeli sıralama verileri bir seferde yalnızca bir bit taşıyabilir.
Bunun ana nedeni, gözlerinizi hoş karşılamayan zaman karmaşıklığı O (n²).
GIF sohbet için ayrılamaz, burada nasıl daha az olabilir! GIF resmi sayesinde, öncekilerin müthiş nefesini hissedebilirsiniz!
Tepe sıralaması Karşılaştırarak Tüm öğeler İyileştirmek için birkaç alana bölündü Ekleme sıralama performansı . Yani, veriler iki boyutlu bir dizide alanlara bölünebilir, Bölge başına bir sütun , Ve sonra her sütunu sıralayın.
Sıralanacak dizi --- , Önce adım uzunluğunu 3 olarak ayarlayın, Adım uzunluğunu daha sonra görün
Örnek bir
İlk gruplama < Adım boyutu == 3 > Orijinal veriler
9, 1, 5
8, 3, 7
4, 6, 2
İlk ayıklamadan sonra;
4, 1, 2
8, 3, 5
9, 6, 7
İkinci gruplama < Adım boyutu == 2 > Orijinal veriler;
4, 1
2, 8
3, 5
9, 6
7
İkinci türden sonra;
yirmi bir
3, 5
4, 6
7, 8
9
Üçüncü gruplama adımı == 1, sıralamadan sonra
Örnek iki
Yukarıdaki adımları resim şeklinde gösterin:
Anahtar nokta - adım hesaplama
Yukarıdaki ekleme sıralama yoluyla ve Tepe sıralaması Örneğin, Hill sınıflandırmasına ilişkin bir ön anlayışa sahip olmalıyım, ancak Adım Bu şey tamamen belirsiz ... Merak etmeyin;
Çünkü Adım boyutu seçimi, Hill sınıflandırmasının önemli bir parçasıdır Öyleyse onu çıkarın ve ayrı olarak açıklayın; yazarın orijinal önerisi Son adım 1 olana kadar ikiye ve sonra ikiye katlayın. < Ekleme sıralaması > , Ancak daha küçük bir adım boyutuyla sıralama yaparken, daha önce kullanılan daha büyük adım boyutu hala sıralıdır. , Bir dizi adım uzunluğu 5'e göre sıralanır ve ardından adım uzunluğu 3'e göre sıralanırsa, bu sıra yalnızca adım uzunluğu 3'e göre değil, aynı zamanda adım uzunluğu 5'e göre de sıralanır. Durum böyle değilse, algoritma yineleme işlemi sırasında önceki sıralamayı bozacak ve sıralama bu kadar kısa sürede tamamlanmayacaktır. Wikipedia'dan alıntı
En iyi bilinen adım dizisi Sedgewick tarafından önerilmiştir ** 1, 5, 19, 41, 109, ... **
İki dizinin öğelerinin araya eklenmesiyle elde edilir: < Formül: 9 (4 K-2 K) + 1 ve 2 K + 2 (2 K + 2-3) + 1 >
1, 19, 109, 505, 2161, ... ..., || 9 (4 k-2 k) + 1, K = 0, 1, 2, 3, ...
5, 41, 209, 929, 3905, ... .. || 2 K + 2 (2 K + 2-3) + 1, K = 0, 1, 2, 3, ...
Bu çalışma aynı zamanda, "karşılaştırmanın Hill sınıflandırmasında en önemli işlem olduğunu, değiş tokuş değil" olduğunu göstermektedir. Böyle bir aşamalı sırayla tepe sıralaması, yerleştirmeli sıralamadan daha hızlıdır ve hatta küçük dizilerde hızlı sıralama ve yığın ayırmadan daha hızlıdır. Hızlı, ancak Hill sıralama, büyük miktarda veri söz konusu olduğunda hızlı sıralamadan daha yavaştır. Algorithms-Shellsort'u Sıralama konusuna bakın
OC Hill sıralama kodu
- (void) algoritma_shellSortWith: (NSMutableArray *) array {
//Toplam uzunluk
int n = (int) array.count; // Döngü için en dıştaki adım sayısı belirlenir < Adım uzunluğu 1'e eşit olana kadar ikiye katlayın >
for (int gap = n / 2; gap > 0; boşluk / = 2) {
NSLog (@ " ----% d", boşluk); // Adım uzunluğuyla ayrılmış bir çift sayının sonunu belirleyin.
for (int i = boşluk; i < n; i ++) {
NSLog (@ "% d konumu ile% d konumu arasındaki karşılaştırma", i-boşluk, i); // önceki çifti bul, artı değerlendirme < İlkinden başlayın > < Artan azalan > , j - = boşluk, grup içinde sırala
for (int j = i-gap; j > = 0 dizi > dizi; j - = boşluk) {
! // Pozisyon değişimi
;
}
}
}
NSLog (@ "----% @", dizi);
}
Yine de halletmem gerekiyor .....
Daha heyecan verici içerik için lütfen "IT Actual Combat Alliance" a dikkat edin ~~~