#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <time.h>
//打印数组
void PrintArray(int* a, int n);
//插入排序(最坏的情况下:逆序,才是等差数列)
void InsertSort(int* a, int n);
cs复制代码
Sort.c
cs复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"Sort.h"
#include"Stack.h"
//打印数组
void PrintArray(int* a, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\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;
}
}
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <time.h>
//打印数组
void PrintArray(int* a, int n);
//希尔排序
void ShellSort(int* a, int n);
cs复制代码
Sort.c
一组一组的预排序
cs复制代码
//希尔排序
//步骤:1、预排序(接近有序);2、直接插入排序
//预排序:分别对每个分组进行插入排序
void ShellSort(int* a, int n)
{
//把间隔为gap的值看作一组
int gap = 3;
//gap组预排序
for (int j = 0; j < gap; j++)
{
//一组预排序
for (int i = 0; i < n - gap; i += gap)
{
//[0,end],我们把end+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;
}
}
}
多组一块预排序
cs复制代码
//希尔排序(时间复杂度:平均是O(N^1.3))
//步骤:1、预排序(接近有序);2、直接插入排序
//预排序:分别对每个分组进行插入排序(gap越大,大的值更快调到后面,小的值更快调到前面,但是越不接近有序)
//(gap越小,跳的越慢,但是越接近有序。如果gap == 1就是直接插入排序),所以gap不能是固定值。
void ShellSort(int* a, int n)
{
//把间隔为gap的值看作一组
int gap = n;
//gap > 1时是预排序,目的是让他接近有序
//gap == 1是直接插入排序,目的是让它有序
while (gap > 1)
{
//gap = gap / 2;//上下两个都行
gap = gap / 3 + 1;//一定要保证gap最后一次是1
//多组一块预排序
for (int i = 0; i < n - gap; i++)
{
//[0,end],我们把end+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;
}
}
}