1.直接插入排序
直接将数组中的每两个数据进行对比,大的往后移动,直到移动到没有比该数据大的,再用原数据进行替换,代码如下
void insertsort(int* a, int n) //插入排序 最坏O(N^2) O(N)
{
for (int i = 0;i < n - 1;i++) //i是小于n-1 而不是n 是n的话会越界
{
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
--end;
}
else
{
break;
}
}
a[end+1] = tmp;
}
}
由于是数据内的数据进行对比,所以不能i不能取最后一个数据的坐标
时间复杂度O(N^2),空间复杂度O(1),具有稳定性。
2.希尔排序
首先进行预排序,每隔三个数据进行比较,最后每个数据进行直接插入排序
void shellsort(int* a, int n)
{
int gap = 3;
for (int j = 0;j < gap;j++) //gap有多少组
{
for (int i = 0;i < n-gap;i += gap)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
进行优化
当gap为1 时,希尔排序就是直接插入排序
优化成2层循环
void shellsort1(int* a, int n) //gap是1 就是直接插入排序
{
int gap = 3;
for (int i = 0;i < n-gap;++i)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
再进行优化。由于数据的个数无法确定,所以用gap=n来规范大小
void shellsort2(int* a, int n)
{
int gap = n;
while (gap > 1) //预排次数就log以3/2为底的对数
{
// gap = gap / 2 ;
gap = gap / 3 + 1;
for (int i = 0;i < n - gap;++i)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
gap>1时都是预排序,让数据接近有序,当gap==1时,就是直接插入排序,数据完全有序。
时间复杂度O(N^1.3),空间复杂度O(1),不具有稳定性。
3.测试
int main()
{
int a[]={1, 5, 6, 3, 1, 7, 8, 9, 5, 2, 1, 4, 6, 3};
int n = sizeof(a) / sizeof(int);
shellsort2(a, n);
for (int i = 0;i < n;i++)
{
printf("%d ", a[i]);
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)