直接插入排序与希尔排序
希尔排序是直接插入排序的优化
直接插入排序思路:
将一个数插入一个有序集合;最好时间效率O(N),最坏时间效率O(N2);
希尔排序思路:
先进行预排序(与插入排序思路相同,就是gap开始大于1),预排序完将小值放在了前面,大值放在了后面,使数组接近有序;当gap=1时,进行插入排序;此时的插入排序O(N^1.25)---O(1.6*N^1.25);
代码如下:
<span style="font-size:18px;">#include<iostream>
using namespace std;
//希尔排序
void ShellSort(int* arr, int len)
{
if (arr == NULL && len <= 0)
return;
//int gap = len / 3 + 1;
int gap = len;
while (gap > 1)
{
gap = gap / 3 + 1;
for (int i = gap; i < len; ++i)
{
int end = i - gap;
int cur = arr[end + gap]; //保存当前待插入的数据
//挪动数据
while (end >= 0 && arr[end] > cur)
{
arr[end+gap] = arr[end];
end -= gap;
}
arr[end + gap] = cur;
}
}
}
//直接插入排序
void InsertSort(int* arr,int len)
{
if (arr == NULL && len <= 0)
return;
for (int i = 0; i < len - 1; ++i)
{
int end = i;
int cur = arr[end + 1]; //待插入的数据
// 挪动数据
while (end >= 0 && arr[end] > cur)
{
arr[end + 1] = arr[end];
--end;
}
arr[end + 1] = cur;
}
}
void Print(int* arr, int len)
{
if (arr == NULL && len <= 0)
return;
for (int i = 0; i < len; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
void TestInsertSort()
{
int array[10] = { 2, 9, 5, 8, 3, 6, 1, 7, 0, 4 };
InsertSort(array, 10);
Print(array, 10);
}
void TestShellSort()
{
int array[10] = { 2, 9, 5, 8, 3, 6, 1, 7, 0, 4 };
ShellSort(array, 10);
Print(array, 10);
}
</span>
测试结果如下图: