Bir Diziyi İndex’e Göre Sıralamak: C++ ile Gizemi Çözmek
Dizileri sıralamak, programlamada temel bir görevdir; ancak sıralı değerlerin kendisinden ziyade yalnızca sıralı değerlerin indekslerine ihtiyacınız varsa ne olur? Bu yaygın sorun, özellikle C veya C++ kullanan birçok geliştiricinin ilgisini çekmiştir. Bu yazıda, bir diziyi değerine göre nasıl sıralayabileceğimizi ve sıralı sırayla elemanların indekslerini nasıl döndürebileceğimizi açıklayacağız.
Sorun
Diyelim ki bir tamsayı diziniz var ve amacınız bunu artan sırayla sıralamak. Ancak, sıralı sayıları kendileri yerine, bu sıralı sayıların orijinal indekslerini gösteren bir dizi istiyorsunuz. Örneğin, aşağıdaki girdi dizisini ele alalım:
Girdi: 1, 3, 4, 9, 6
Çıktının sıralı değerlerin indekslerini yansıtması gerekiyor:
Çıktı: 1, 2, 3, 5, 4
Sıralamada Bir Değişiklik
Muhtemelen, sorguda bahsedilen shell sort prosedürü gibi bir sıralama algoritması kullanıyorsunuz. Ancak, belirli programlama uygulamaları hatalara neden olabilir, özellikle işaretçilerle çalışırken. Bu yazı, C/C++‘ta dizilerle nasıl çalışılacağını ve belirtilen gereksinimleri karşılayan bir sıralama işlevinin nasıl oluşturulacağını netleştirmeyi amaçlamaktadır.
Adım 1: İşaretçilerden Oluşan Bir Dizi Oluşturun
Pozisyon bilgilerini kaybetmeden sıralama yapmak için, orijinal dizinin elemanlarına işaret eden bir işaretçi dizisi oluşturabiliriz. Bu şekilde işaretçileri sıraladığımızda, dolaylı olarak orijinal dizi değerlerini sıralamış oluruz ve indeks haritasını korumuş oluruz. Bunu şöyle yapabilirsiniz:
int* intArray; // Bu, tamsayı değerlerinizle başlatılacak.
int arrayLen; // Tamsayı dizisinin uzunluğu.
int** pintArray = new int*[arrayLen]; // Bir işaretçi dizisi oluştur.
for(int i = 0; i < arrayLen; ++i)
{
pintArray[i] = &intArray[i]; // İlgili elemanlara işaret et.
}
Adım 2: İşaretçi Dizisini Sırala
İşaretçileri hazırladıktan sonra, işaretçilerin göstermiş olduğu değerlere göre sıralamak için herhangi bir sıralama algoritmasını (örneğin shell sort) uygulayabilirsiniz. İşte basit bir gösterim:
SortIntPointers(pintArray, arrayLen); // Değerlere göre işaretçi dizisini sıralar.
Adım 3: Sıralı İndeksleri Ata
İşaretçileri sıraladıktan sonra, bunlara göz atabilir ve sıralanmış pozisyonlarını orijinal işaretçi dizisine atayabilirsiniz. Bu, uygun indeksleri almanızı sağlar.
for(int i = 0; i < arrayLen; ++i)
{
*pintArray[i] = i; // Sıralı indeks pozisyonlarını ata.
}
Tam Uygulama Örneği
Tüm adımları bir araya getirdiğimizde, yukarıda belirtilen adımları takip eden bir komple örnek burada:
void SortIntPointers(int** pArray, int ArrayLength) {
int flag = 1;
int* temp;
for (int i = 1; (i <= ArrayLength) && flag; i++)
{
flag = 0;
for (int j = 0; j < ArrayLength - 1; j++)
{
if (*pArray[j + 1] < *pArray[j]) // Artan sıraya değiştirme
{
temp = pArray[j]; // Elemanları değiştir
pArray[j] = pArray[j + 1];
pArray[j + 1] = temp;
flag = 1; // Bir değişim gerçekleşti.
}
}
}
}
// Daha önce gösterildiği gibi işaretçilerinizi başlatın ve sıralayın.
Sonuç
Dizileri indeksle sıralamak ve orijinal pozisyonlarını kaybetmemek zor olabilir, özellikle de C/C++’ta işaretçi kullanırken. İşaretçilerden oluşan bir dizi oluşturarak ve sıralayarak, bu zorluğu etkili bir şekilde yönetebilirsiniz. Daha sağlam bir kod için hata ayıklama ve köşe durumlarını göz önünde bulundurmayı unutmayın. İyi kodlamalar!