希尔排序(shellsort)又叫增量递减排序(diminishing increment)
2010-02-11 10:41
579 查看
希尔排序(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)。
算法如下
#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;
}
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)。
算法如下
#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;
}
相关文章推荐
- shell排序,希尔排序,递减增量排序。
- 无聊写排序之 ---- 希尔排序(ShellSort)
- 排序——希尔排序(Shell Sort)
- 用java 和 python将希尔排序Shell's Sort 的每一步打印出来(每次的增量没有固定规则)
- C++实现谢尔排序(希尔排序)(shell sort)
- PHP Array -- PHP 排序 -- 希尔排序(Shell Sort)
- 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)
- 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)
- 排序之希尔排序(Shell Sort)
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
- uva 10152 ShellSort 龟壳排序(希尔排序?)
- 排序_Shell_Sort(希尔排序)
- 【排序算法 】希尔排序 shell sort(插入类排序)
- 插入排序之希尔排序(Shell Sort)
- uva 10152 ShellSort 龟壳排序(希尔排序?)
- [排序] 希尔排序(Shell Sort)
- 排序 —— 希尔排序(Shell sort)
- 【DS】排序算法之希尔排序(Shell Sort)
- 排序_Shell_Sort(希尔排序)更正版
- 排序--希尔排序的实现(shellsort)