希尔排序是直接插入排序算法的改进版
1、时间复杂度
最好情况:o(nlogn)
最坏情况:o(n^2)
2、算法思想:
(1)待排序序列分成多个子序列;
(2)每个子序列进行直接插入排序;
具体步骤:
a) 选择一个递减步长序列:s1>s2>s3…….>sk,sk=1;
b) 按照步长k,对序列进行k次排序;
c) 每次排序,根据步长,将整体序列分成长度为m的若干序列,对每个序列进行直接插入排序;
d) 终止条件:步长为1时,对整个序列进行排序;
3、希尔排序算法实现代码
/***************************************************************************
* @file main.cpp
* @author HAOJIEFENGLANG
* @date 5 August 2018
* @remark 5 August 2017
* @theme Shel sort
***************************************************************************/
#include<stdio.h>
#include<stdlib.h>
void ShelSort(int a[], int n)
{
//设置一定的间隔进行跳动
int i, j, temp, count1, count2;
int gap = n;
temp = 0;
count1 = count2 = 0;
do
{
gap = gap / 3 + 1;
for (i = gap; i < n; i++)
{
count1++;
if (a[i] < a[i - gap])
{
//找位置,同时把前面大于a[i]的值往后移动
temp = a[i];
for (j = i - gap; a[j] > temp; j-= gap)
{
count2++;
a[j + gap] = a[j];
}
a[j + gap] = temp;
}
}
} while (gap>1);
printf("比较次数%d,移动次数%d\n", count1, count2);
}
int main()
{
int a[10] = { 1,0,2,3,4,5,6,7,8,9 };
int n = 10;
ShelSort(a, n);
printf("希尔排序后为: ");
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}