10-29-2012
|
#5
|
Prof. Dr. Sinsi
|
Sıralama Algoritmaları
Kabuk sıralaması
(İngilizcesi: Shell sort), bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır Eklemeli sıralama algoritmasının aşağıdaki iki gözlem kullanılarak genelleştirilmiş biçimidir:
Eklemeli sıralama, sıralanacak dizi zaten büyük oranda sıralıysa daha verimli çalışır
Eklemeli sıralama, dizideki öğeleri her adımda yalnızca bir sonraki konuma aktardığından verimsizdir
Algoritmanın Geçmişi
Kabuk sıralaması algoritmasının adı algoritmayı bulan kişi olan Donald Shell'den gelmektedir Soyadı İngilizce'de Kabuk anlamına gelen Donald Shell algoritmayı 1959 yılında yayınlamıştır
Uygulamalar
C/C++ dilinde yazılmış kabuk sıralaması
Aşağıda C/C++ dilinde yazılmış, bir sayı dizisini kabuk sıralaması algoritmasını kullanarak sıralayan bir program verilmiştir
/*
SHELL SORT
Written by erengencturk net
*/
#include <stdio h>
#define ELEMENTS 6
void shellsort(int A[],int max)
{
int stop,swap,limit,temp,k;
int x=(int)(max/2)-1;
while(x>0)
{
stop=0;
limit=max-x;
while(stop==0)
{
swap=0;
for(k=0;k<limit;k++)
{
if(A[k]>A[k+x])
{
temp=A[k];
A[k]=A[k+x];
A[k+x]=temp;
swap=k;
}
}
limit=swap-x;
if(swap==0)
stop=1;
}
x=(int)(x/2);
}
}
int main()
{
int i;
int X[ELEMENTS]={5,2,4,6,1,3};
printf("Unsorted Array:
");
for(i=0;i<ELEMENTS;i++)
printf("%d ",X[i]);
shellsort(X,ELEMENTS);
printf("
SORTED ARRAY
");
for(i=0;i<ELEMENTS;i++)
printf("%d ",X[i]);
}
Java dilinde yazılmış kabuk sıralaması
public static void shellSort(int[] a) {
for (int increment = a length / 2; increment > 0;
increment = (increment == 2 ? 1 : (int) Math round(increment / 2 2))) {
for (int i = increment; i < a length; i++) {
int temp = a[i];
for (int j = i; j >= increment && a[j - increment] > temp; j -= increment){
a[j] = a[j - increment];
a[j - increment] = temp;
}
}
}
}
Python dilinde yazılmış kabuk sıralaması
def shellsort(a):
def increment_generator(a):
h = len(a)
while h != 1:
if h == 2:
h = 1
else:
h = 5*h//11
yield h
for increment in increment_generator(a):
for i in xrange(increment, len(a)):
for j in xrange(i, increment-1, -increment):
if a[j - increment] < a[j]:
break
a[j], a[j - increment] = a[j - increment], a[j]
return a
|
|
|