一、直接插入排序
1.算法平均时间复杂度为 O(),空间复杂度为O(1)
2.C++代码
void InsertSort(int R[], int n) //直接插入排序
{
int i, j;
int temp;
for (i = 1; i < n; ++i)
{
temp = R[i];
j = i;
while (j>=1 && temp<R[j-1])
{
R[j] = R[j-1];
--j;
}
R[j] = temp;
}
}
二、折半插入排序
1.算法平均时间复杂度为 O(),空间复杂度为O(1)
2.C++代码
void BinaryInsertSort(int R[],int n) //折半插入排序
{
int i, j, temp, low, high, mid;
for (i = 1; i < n; ++i)
{
temp = R[i];
low = 0; high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (R[mid] > temp)
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; --j)
R[j + 1] = R[j];
R[j + 1] = temp;
}
}
三、希尔排序(缩小增量排序)
1.算法平均时间复杂度为 O(),空间复杂度为O(1)
2.C++代码
void ShellSort(int R[], int n) //希尔排序(缩小增量排序)
{
int s, i, j, temp, gap=1;
while (gap < n / 3) //动态定义间隔序列
{
gap = gap * 3 + 1;
}
for (gap; gap > 0; gap = (gap-1) / 3) //选择不同增量
{
for (s = 0; s < gap; ++s) //选择不同子序列
{
for (i = gap; i < n; i+=gap) //对每一个子序列进行直接插入排序
{
temp = R[i];
for (j = i; j >= gap && temp < R[j-gap]; j -= gap)
{
R[j] = R[j-gap];
}
R[j] = temp;
}
}
}
}
四、整体测试代码
#include <stdio.h>
#include <stdlib.h>
void PrintArray(int R[],int n) //打印数组
{
for (int i = 0; i < n; i++)
{
printf("%d ", R[i]);
}
printf("\n");
}
int main()
{
int A[] = { 49,37,25,67,59,33,45 };
int B[] = { 52,25,32,14,19,56,48,29,3,2,3,5,4,44,65,12,22 };
//InsertSort(A, 7);
//BinaryInsertSort(A, 7);
ShellSort(A, 7);
PrintArray(A, 7);
//InsertSort(B, 17);
//BinaryInsertSort(B, 8);
ShellSort(B, 17);
PrintArray(B, 17);
system("pause");
return 0;
}