基本思想
根据步长给序列分组,每组又通过直接插入排序算法进行排序,然后通过不断缩短步长,直接插入排序算法进行排序,直至步长为1,则序列排序完成。
直接插入与希尔排序适用情况
思路分析
选定步长gap,将 gap 位定为 i,则 i 与 i - gap位为一组序列 通过直接插入排序将该序列进行排序,排序成功后,i 往后移动一位,直至 i = len,则第一趟排序成功 重复1、2,当gap = 1,整个序列排序成功
代码实现(c语言)
void Shell_Insert_Sort ( DataType arr[ ] , int len)
{
int gap;
int i, j, temp;
for ( gap = len >> 1 ; gap > 0 ; gap >>= 1 )
{
for ( i = gap; i < len; i++ )
{
temp = arr[ i] ;
for ( j = i - gap; j >= 0 && arr[ j] > temp; j - = gap)
{
arr[ j + gap] = arr[ j] ;
}
arr[ j + gap] = temp;
}
}
}
性能分析
代码测试(c语言)
#include <stdio.h>
typedef char DataType;
void Shell_Insert_Sort ( DataType arr[ ] , int len)
{
int gap;
int i, j, temp;
for ( gap = len >> 1 ; gap > 0 ; gap >>= 1 )
{
for ( i = gap; i < len; i++ )
{
temp = arr[ i] ;
for ( j = i - gap; j >= 0 && arr[ j] > temp; j - = gap)
{
arr[ j + gap] = arr[ j] ;
}
arr[ j + gap] = temp;
}
}
}
int main ( )
{
DataType arr[ ] = { 'c' , 'a' , 'd' , 'b' , 'f' , 's' ,
'h' , 'u' , 'q' , 'w' , 'e' , 'r' ,
't' , 'y' , 'i' , 'o' , 'p' , 'g' ,
'j' , 'k' , 'l' , 'z' , 'x' , 'v' ,
'n' , 'm' } ;
int len = sizeof ( arr) / sizeof ( DataType) ;
Shell_Insert_Sort ( arr, len) ;
for ( int i = 0 ; i < len; i++ )
{
printf ( "%c\n" , arr[ i] ) ;
}
return 0 ;
}
资料参考
希尔排序