希尔排序(shellsort)算法实现
生活随笔
收集整理的這篇文章主要介紹了
希尔排序(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)。
算法如下
#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;
}
????? 假設有一個數組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;
}
轉載于:https://www.cnblogs.com/nokiaguy/archive/2008/05/15/1199359.html
總結
以上是生活随笔為你收集整理的希尔排序(shellsort)算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2008/5/8
- 下一篇: 唯品会上的唯品花是什么意思