IS.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void Swap(int* a, int* b);
// 插入排序
void InsertSort(int* a, int n);
// 希尔排序
void ShellSort(int* a, int n);
IS.c
#include"IS.h"
// 插入排序
void Swap(int* a, int* b)
{
int mid = *a;
*a = *b;
*b = mid;
}
void InsertSort(int* a, int n)
{
assert(n > 0);
if (n == 1)//只有一个元素
return;
for (int i = 0; i < n - 1; i++)
{
int end=i;
int tmp = a[end + 1];//记录要比较的数
while (end >= 0)
{
if (a[end] <= tmp)
{
a[end + 1] = tmp;
break;
}
else
{
a[end + 1] = a[end];//tmp一定在end之前,数据往后挪
}
end--;
}
if (end == -1)//tmp最小
a[0] = tmp;
}
}
// 希尔排序
#if 0//初版
void ShellSort(int* a, int n)
{
for (int gap = n / 2; gap >= 1; gap/=2)//gap先是个数的一半,让中间的大的/小的更快移动,在减半,最后gap==1
{
for (int i = 0; i < gap; i++)//把数组全部以gap排一遍,变end
{
for (int j=i; j + gap < n; j += gap)//预排一次
{
int end = j;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp >= a[end])
{
a[end + gap] = tmp;
break;
}
else
a[end + gap] = a[end];
end -= gap;//注意end要变化,往前移
}
if (end < 0)
a[0] = tmp;
}
}
}
}
#endif
#if 1//简化版#if 1//简化版
void ShellSort(int* a, int n)
{
for (int gap = n / 2; gap >=1; gap /= 2)
{
for (int i = 0; i + gap < n; i++)//初版先排一组,再排gap-1组,现在在前一组插入一次同时排第二组
{
int end = i;
int tmp = a[end + gap];
while (end >= 0&&a[end]>tmp)//插入一组,排一组要插log(gap)n次
{
a[end + gap] = a[end];
end -= gap;//注意end要变化,往前移
}
a[end+gap] = tmp;
}
}
}
#endif
main.c
#include"IS.h"
#include<time.h>
#define ARRAYNUM 100
int main()
{
int array[ARRAYNUM];
srand((unsigned int)time(0));
for (int i = 0; i < ARRAYNUM; i++)
{
array[i] = rand() % 100 + 1;
}
#if 0
//插入
InsertSort(array, ARRAYNUM);
for (int i = 0; i < ARRAYNUM; i++)
printf("%d ", array[i]);
printf("\n");
#endif
#if 1
//希尔
ShellSort(array, ARRAYNUM);
for (int i = 0; i < ARRAYNUM; i++)
printf("%d ", array[i]);
printf("\n");
#endif
}