希爾排序(shellsort)算法實現
希爾排序(shellsort)又叫增量遞減(diminishing increment)排序,是由D.L. Shell發明的,這個算法是通過一個逐漸減小的增量使一個數組逐漸趨近于有序從而達到排序的目的。
假設有一個數組int data[16] = {...}。 首先將這個增量設為16 / 2 = 8, 這樣就將這個數組分成了8個子數組,它們的索引是0, 8 1, 9 2, 10等等 。對這些子數組進行排序。然后再使增量為8 / 2 = 4,這樣就將原數組分成了4個子數組,它們的索引分別是0, 4, 8, 12 1, 5, 9, 13等等。再對這四組數進行排序,直到增量為1。
以上所描述的增量遞減只是一種方法,這種方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1 f(1) = 1 (..., 121, 40, 13, 4, 1)就比上面的取增量的方法好。這種方法的時間復雜度是O(n ^1.5)。
算法如下
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
假設有一個數組int data[16] = {...}。 首先將這個增量設為16 / 2 = 8, 這樣就將這個數組分成了8個子數組,它們的索引是0, 8 1, 9 2, 10等等 。對這些子數組進行排序。然后再使增量為8 / 2 = 4,這樣就將原數組分成了4個子數組,它們的索引分別是0, 4, 8, 12 1, 5, 9, 13等等。再對這四組數進行排序,直到增量為1。
以上所描述的增量遞減只是一種方法,這種方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1 f(1) = 1 (..., 121, 40, 13, 4, 1)就比上面的取增量的方法好。這種方法的時間復雜度是O(n ^1.5)。
算法如下
#include <stdio.h>
void output_array(int data[], int n)
{
int i;
for(i = 0; i < n; i++)
printf("%d ", data[i]);
printf("\n");
}
void swap(int *a, int *b)
{
int x;
x = *a;
*a = *b;
*b = x;
}
void insertion_sort(int data[], int n, int increment)
{
int i, j;
for(i = increment; i < n; i += increment)
for(j = i; j >= increment && data[j] > data[j - increment]; j -= increment)
swap(&data[j], &data[j - increment]);
}
void shellsort(int data[], int n)
{
int i, j;
for(i = n / 2; i > 2; i /= 2)
for(j = 0; j < i; j++)
insertion_sort(data + j, n - j, i);
insertion_sort(data, n, 1);
}
int main()
{
int data[] = {5, 3, 1, 665, 77, 66, 44, 11, 10, 9, 8, 6};
output_array(data, 12);
shellsort(data, 12);
output_array(data, 12);
return 0;
}
void output_array(int data[], int n)
{
int i;
for(i = 0; i < n; i++)
printf("%d ", data[i]);
printf("\n");
}
void swap(int *a, int *b)
{
int x;
x = *a;
*a = *b;
*b = x;
}
void insertion_sort(int data[], int n, int increment)
{
int i, j;
for(i = increment; i < n; i += increment)
for(j = i; j >= increment && data[j] > data[j - increment]; j -= increment)
swap(&data[j], &data[j - increment]);
}
void shellsort(int data[], int n)
{
int i, j;
for(i = n / 2; i > 2; i /= 2)
for(j = 0; j < i; j++)
insertion_sort(data + j, n - j, i);
insertion_sort(data, n, 1);
}
int main()
{
int data[] = {5, 3, 1, 665, 77, 66, 44, 11, 10, 9, 8, 6};
output_array(data, 12);
shellsort(data, 12);
output_array(data, 12);
return 0;
}
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2008-05-15 22:01 銀河使者 閱讀(2398) 評論(1) 編輯 收藏 所屬分類: algorithm 、C/C++