插入排序分为直接插入排序和希尔排序,希尔排序是在直接插入排序的基础上做出的优化版本(原因后面解释)。
代码如下:
cpp
//直接插入排序
void InsertSort(int arr[], int sz)
{
for (int i = 0; i < sz - 1; i++)
{
int mark = i;
int tmp = arr[mark + 1];
while (mark >= 0)
{
if (tmp < arr[mark])
{
arr[mark + 1] = arr[mark--];
}
else
{
break;
}
arr[mark + 1] = tmp;
}
}
}
//希尔排序
void ShellSort(int arr[], int sz)
{
int gap = sz;
while (gap > 1)
{
gap = gap / 3 + 1;
for (int i = 0; i < sz - gap; i++)
{
int mark = i;
int tmp = arr[mark + gap];
while (mark >= 0)
{
if (tmp < arr[mark])
{
arr[mark + gap] = arr[mark];
mark -= gap;
}
else
{
break;
}
arr[mark + gap] = tmp;
}
}
}
}
//打印数组
void Print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
头文件:
cpp
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void InsertSort(int arr[], int sz);
void ShellSort(int arr[], int sz);
void Print(int arr[], int sz);
测试:
因为直接插入排序时间复杂度最好是O(n),最坏是O(n^2),最坏情况是排序对象是降序排列的,希尔通过把排列对象划分成若干部分,这些部分内部进行直接插入排序,粗略把排序对象排列成升序,从而优化排序过程,也即是希尔把直接插入排序的最坏情况避免了。
谢谢观看!