直接排序与快速插入排序
Test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Sort.h"
void TestInsertSort()
{
int a[] = { 9,1,2,5,7,4,8,6,3,5 };
InsertSort(a, sizeof(a) / sizeof(a[0]));
PrintArray(a, sizeof(a) / sizeof(a[0]));
}
void TestShellSort()
{
int a[] = { 9,1,2,5,7,4,8,6,3,5 };
ShellSort(a, sizeof(a) / sizeof(a[0]));
PrintArray(a, sizeof(a) / sizeof(a[0]));
}
int main()
{
//TestInsertSort();
TestShellSort();
return 0;
}
Sort.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void PrintArray(int* a, int n);
void InsertSort(int* a, int n);
void ShellSort(int* a, int n);
Sort.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Sort.h"
void PrintArray(int* a, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
//直接插入排序:
//插入排序的时间复杂度为:O(N^2)
//其最优情况为:顺序有序/接近顺序有序 O(N)
//最坏情况为:逆序 O(N^2)
void InsertSort(int* a, int n)
{
//整体排序
for (int i = 0; i < n - 1; i++)
{
//单趟排序
// [0,end]有序,把end+1位置的值插入,保持有序
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
//希尔排序【通俗来说为:分组插入排序/缩小增量排序】:a、预排序【让大的数据尽量排在后面,小的数据尽量排在前面】(接近顺序有序) b、直接插入排序(有序)
//在希尔排序中:时间复杂度约为:O(N^1.3)/ O(N^logN)
//排升序时,gap越大,大的数更快到后面,小的数可以更快的到前面,但是越不接近有序。
//排升序时,gap越小,越接近有序的;当gap==1时,就是直接插入排序。
void ShellSort(int* a, int n)
{
int gap = n;//gap为同组数据之间的间隙
while (gap > 1)
{
//先进行多组预处理排序(gap>1时);最后当gap==1时,进行直接插入排序。
gap = gap / 3 + 1;
//gap组数据交替插入排序
for (int i = 0; i < n - gap; i++)
{
//一个数据(间距为:gap)的插入排序
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}