数据结构与算法之希尔排序

  • ​​前提条件​​
  • ​​简介​​
  • ​​希尔排序算法​​
  • ​​完整代码​​
  • ​​输出结果​​

前提条件

  • 熟悉C语言与指针
  • 熟悉数据结构与算法

简介

  • 希尔排序(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;
}

输出结果

数据结构与算法之希尔排序_i++_02