记录自己所学,无详细讲解
1.插入排序
从第二个元素开始, 第二个元素前面的元素看作一个数组,然后从右到左依次比较
如果第二个元素大于前面第一个元素则不变,因为升序,大于他则代表位置不用变动
如果第二个元素小于前面第一个元素,则保存第二个元素值进tmp变量里,然后再比较第一个元素前面的,因为是第一个元素 所以没有元素可比较了,所以最后将tmp值赋给此时的比较位置
#include <stdio.h>
void Insertsort(int a[])
{
int i = 0;
for (int i = 0; i < 9;i++)
{
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;
}
}
void Print(int a[])
{
for (int i = 0; i < 10; i++)
{
printf("%3d", a[i]);
}
}
int main()
{
int a[10] = { 3, 4, 6, 1, 7, 9, 2, 5, 8, 10 };
Insertsort(a);
Print(a);
return 0;
}
2.希尔排序
插入排序的优化版(只是多了一层循环,添加了一个gap变量,更改了几个变量值)
在正式插入排序前先进行了几次小的插入排序,将数组先大概的排个序,大概排完序再正式排
通过gap来作为分割距离,将数组分成多组来进行插入排序,最后gap=1是表示不用分组了,则代表正式插入排序了
希尔排序时间复杂度是n的1.3次方 而直接正式插入排序的话时间复杂度是n的2次方,数据越多差距越明显
#include <stdio.h>
void Shellsort(int a[])
{
int gap =10;
while (gap>1)
{
gap = gap / 2;
for (int i = 0; i < 10-gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
end = end - gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
void Print(int a[])
{
for (int i = 0; i < 10; i++)
{
printf("%3d", a[i]);
}
}
int main()
{
int a[10] = { 3, 4, 6, 1, 7, 9, 2, 5, 8, 10 };
Shellsort(a);
Print(a);
return 0;
}