2016-04-12 20 views
3

Hava durumu verilerini sıralama yeteneğine sahip olması gereken bir program yazıyorum. İşlevsel özelliklerden biri, verileri aylara göre sıraladığınızda, takvimde göründükleri ayları sıralamak zorunda olmasıdır (eğer artan sıradaysa, Ocak, Şubat, Mart vb. Olmak zorundadır; Nisan, Ağustos, vb.).Ay takviminde ayları sıralamak için QuickSort'u kullanma

Yaşadığım sorun, algoritmanın (QuickSort) diziyi istediğim gibi sıralamamasıdır.

public static void sortMonths(string[] month,int left,int right) 
{ 
    Dictionary<string,int> monthsDictionary = new Dictionary<string,int>() 
    { 
     {"January",1}, 
     {"February",2}, 
     {"March",3}, 
     {"April",4}, 
     {"May", 5}, 
     {"June", 6}, 
     {"July", 7}, 
     {"August", 8}, 
     {"September", 9}, 
     {"October", 10}, 
     {"November", 11}, 
     {"December", 12}, 
    }; 

    int i = left,j = right; 

    string[] sortedMonth = month; 

    string tempMonth; 

    string pivot = sortedMonth[(i+j)/2]; 

    while(i<=j) 
    { 
     while(monthsDictionary[sortedMonth[i]] < monthsDictionary[pivot]) 
      i++; 
     while(monthsDictionary[sortedMonth[j]] > monthsDictionary[pivot]) 
      j--; 
     if(i <= j) 
     { 
      tempMonth = sortedMonth[i]; 
      sortedMonth[i] = sortedMonth[j]; 
      sortedMonth[j] = tempMonth; 

      i++; 
      j--; 
     } 
    }; 

    if(left < j) 
    { 
     sortMonths(sortedMonth,left,j); 
    } 
    else if(i < right) 
    { 
     sortMonths(sortedMonth,i,right); 
    } 

    for(int ctr = 0;ctr < sortedMonth.Length; ctr++) 
     Console.WriteLine(sortedMonth[ctr]); 
} 

ben bu görevi yaklaşan bir yolu yapıyorum budur eşdeğer sayı değerlerine, ay isimlerini noktasına bir sözlük kullandığını duydum, ama yine de çalışmak için görünmüyor . Sadece neyi yanlış yaptığımı bilmek istiyorum ve bunu düzeltmek için ne yapmalıyım. Belki bu işe daha iyi bir çözüm veya kullanabileceğim daha iyi bir algoritma var mı? Ayrıca, önceden tanımlanmış sıralama işlevlerini kullanmama izin verilmez ve sonunda döngü, dizinin tamamlandığını görmek içindir.

+1

Ben bu nedenle bu görev için bir sözlük kullanmak ister: "numaralandırma amaçları için, sözlükte her öğe bir KeyValuePair olarak bir değeri ve anahtarını temsil yapıyı tedavi edilir. Öğelerin döndürülme sırası tanımsız. " Ayları {name, value} 'i tamamlayan ve sıralama yapmak için bir Ay dizisini başlatan bir sınıf oluşturacağım. string [] sıralanmışMonth = bu değişken Quicksort'ta gereksizdir. – raven

+0

Kodunuz iyi görünüyor, ancak neden her aramada sonuçları yazdırıyorsunuz? –

+0

Roberto De La Parra- Sözünü ettiğim sınıfı nasıl yapabilirim, sorabilir miyim? Arturo Menchaca - Bunu yapıyorum çünkü dizinin doğru bir şekilde sıralandığından emin olmak istiyorum. Bu algoritmayı kurduktan sonra döngüden kurtulacağım. – terasss2

cevap

1
  1. Aylarınızı tam sayılara dönüştürün. Bir int[] istiyorsun.

  2. int[] ürününü sıralayın.

  3. int[] dosyasını bir string[] (ay adları) haline dönüştürebilirsiniz.

  4. Orijinal month dizisindeki tüm değerlerin, sıralanmış olanların üzerine yaz.

+0

Ama aylar dizeleri, yani, onlar sayı değil. Hala onları dönüştürür müsün? – terasss2

+1

"Ocak" -> 0, "Şubat" -> 1, vb. Bunun için örnek C# koduna ihtiyacınız var mı? İpucu: 'int ConvertMonthStringToInt (dize ay) {geçiş (ay) {...}}' – Asik

+0

Teşekkürler. Bunu bir şans vereceğim. – terasss2

İlgili konular