数据结构与算法之希尔排序
原创
©著作权归作者所有:来自51CTO博客作者wx63dcd9d7dd8a8的原创作品,请联系作者获取转载授权,否则将追究法律责任
数据结构与算法之希尔排序
- 前提条件
- 简介
- 希尔排序算法
- 完整代码
前提条件
简介
- 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
- 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
希尔排序算法
void shellSort(int data[],int n,int delta[],int m)
/*希尔排序*/
/*delta[]包含长度为m且递减有序的增量序列且序列最后一个元素为1*/
{
int k,i,j,dk;
int temp;
for ( i = 0; i < m; i++)
{
dk = delta[i];
for ( k = dk; k < n; ++k)
{
if(data[k]<data[k-dk])
{/*将元素data[k]插入有序增量子序列中*/
/*备份待插入元素,空出一个元素位置*/
temp=data[k];
for ( j = k-dk; j >=0 && data[j]>temp; j-=dk)
/*
位置互换后,若前dk个位置还有元素,则还要与前dk个位置元素比较,
若前面元素还有比当前元素小的元素,还需要位置互换
*/
{
data[j+dk]=data[j];/*查找插入位置的同时将元素后移*/
}
data[j+dk]=temp;/*找得到插入位置,插入元素*/
}
}
}
}

完整代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
void shellSort(int data[],int n,int delta[],int m)
/*希尔排序*/
/*delta[]包含长度为m且递减有序的增量序列且序列最后一个元素为1*/
{
int k,i,j,dk;
int temp;
for ( i = 0; i < m; i++)
{
dk = delta[i];
for ( k = dk; k < n; ++k)
{
if(data[k]<data[k-dk])
{/*将元素data[k]插入有序增量子序列中*/
/*备份待插入元素,空出一个元素位置*/
temp=data[k];
for ( j = k-dk; j >=0 && data[j]>temp; j-=dk)
/*
位置互换后,若前dk个位置还有元素,则还要与前dk个位置元素比较,
若前面元素还有比当前元素小的元素,还需要位置互换
*/
{
data[j+dk]=data[j];/*查找插入位置的同时将元素后移*/
}
data[j+dk]=temp;/*找得到插入位置,插入元素*/
}
}
}
}
int main(){
int data[6]={4,6,5,1,3,2};
int length = sizeof(data)/sizeof(data[0]);//获取数组长度
int delta[2]={length/2,length/2^2};
shellSort(data,6,delta,2);
printf("the result of the shellSort:\n");
for (int i = 0; i < 6; i++)
{
printf("%d ",data[i]);
}
printf("\n");
system("pause");
return 0;
}
输出结果
