İplik sıralaması
Bu madde hiçbir kaynak içermemektedir. (Temmuz 2024) (Bu şablonun nasıl ve ne zaman kaldırılması gerektiğini öğrenin) |
İplik sıralaması (İngilizce: Strand sort) bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Sıralanacak olan dizinin, sıralanmış alt dizilerinin oluşturularak bu alt dizilerin birleştirilmesi yoluyla sonucun oluşturulması mantığına dayanır. Algoritmanın her bir aşamasında ana dizinin üzerinden geçilir ve bu diziden zaten sıralanmış olan bir dizi eleman çıkarılır. Çıkarılan bu eleman dizileri daha sonra birleştirilir.
Algoritmanın adı, sıralanacak dizinin içinden çıkan kendi içinde sıralanmış alt dizilerin ipliklere benzetilmesinden gelmektedir. İplik sıralaması algoritması, ana diziden ipleri çıkarırken ve oluşan sıralı ipleri birleştirirken karşılaştırma kullandığı için bir karşılaştırma sıralamasıdır.
İplik sıralaması algoritmasının karmaşıklığı ortalamada O(n log n)'dir. Sıralanacak dizinin zaten sıralı olduğu en iyi durumda algoritmanın karmaşıklığı O(n), sıralanacak dizinin tersten sıralı olduğu en kötü durumda ise algoritmanın karmaşıklığı O(n2)'dir.
Örnek
[değiştir | kaynağı değiştir]- Sıralanacak dizinin üzerinden bir kere geçilir ve yükselen (sıralı) sayılar alınır.
- Sıralı olan alt dizi ilk yinelemenin ardından boş olan sıralanmış dizinin üstüne konur.
- Ana dizinin üzerinden yeniden geçilir ve kendi içinde sıralı yeni bir alt dizi çıkarılır.
- Artık sıralanmış dizi boş olmadığından yeni çıkarılan alt dizi sıralanmış diziyle birleştirilir.
- Alt dizi ve ana dizi boşalana kadar 3 ve 4. adımlar yinelenir.
Sıralanmamış dizi | Alt dizi | Sıralanmış dizi |
---|---|---|
3 1 5 4 2 | ||
1 4 2 | 3 5 | |
1 4 2 | 3 5 | |
2 | 1 4 | 3 5 |
2 | 1 3 4 5 | |
2 | 1 3 4 5 | |
1 2 3 4 5 |
Sözde Kodu
[değiştir | kaynağı değiştir]İplik sıralamasının yalın bir sözde kodu aşağıda verilmiştir:
procedure strandSort( A : list of sortable items ) defined as:
while length( A ) > 0
clear sublist
sublist[ 0 ] := A[ 0 ]
remove A[ 0 ]
for each i in 0 to length( A ) do:
if A[ i ] > sublist[ last ] then
append A[ i ] to sublist
remove A[ i ]
end if
end for
merge sublist into results
end while
return results
end procedure
Uygulama Örnekleri
[değiştir | kaynağı değiştir]C# ile uygulama
[değiştir | kaynağı değiştir]Aşağıdaki program iplik sıralamasının C# kullanılarak oluşturulmuş bir uygulamasıdır:
public static LinkedList<int> sort(LinkedList<int> array) {
LinkedList<int> results = new LinkedList<int>();
LinkedList<int> sublist = new LinkedList<int>();
while (array.Count != 0)
{
sublist.Clear();
sublist.AddLast(array.First.Value);
array.RemoveFirst();
LinkedListNode<int> i = array.First;
while (i != null)
{
if(i.Value >= sublist.Last.Value)
{
sublist.AddLast(i.Value);
LinkedListNode<int> temp = i;
i = i.Next;
array.Remove(temp);
}
else
{
i = i.Next;
}
}
i = results.First;
while (sublist.Count != 0)
{
if (i == null)
{
results.AddLast(sublist.First.Value);
sublist.RemoveFirst();
}
else if (sublist.First.Value < i.Value)
{
results.AddBefore(i, sublist.First.Value);
sublist.RemoveFirst();
}
else
{
i = i.Next;
}
}
}
return results;
}
Java ile uygulama
[değiştir | kaynağı değiştir]Aşağıdaki program iplik sıralamasının Java kullanılarak oluşturulmuş bir uygulamasıdır:
public static <E extends Comparable<? super E>> List<E> sort(Collection<E> coll) {
List<E> results = new LinkedList<E>();
while (!coll.isEmpty())
{
LinkedList<E> sublist = new LinkedList<E>();
Iterator<E> i = coll.iterator();
sublist.addLast(i.next());
while (i.hasNext())
{
E val = i.next();
if (val.compareTo(sublist.getLast()) >= 0)
{
sublist.addLast(val);
i.remove();
}
}
if (!results.isEmpty())
{
ListIterator<E> li = results.listIterator();
E current = li.next();
while (!sublist.isEmpty())
{
if (sublist.getFirst().compareTo(current) < 0)
li.add(sublist.removeFirst());
else if (li.hasNext())
current = li.next();
else
break;
}
}
results.addAll(sublist);
}
return results;
}