一.直接插入排序
算法思想
从第二个开始依次与前面的数进行比较,将其插入到合适的位置,使得它前面的数(包括它本身在内)有序。
代码实现
#include<stdio.h>
void InsertSort(int *arr,int len)
{
int tmp;//用来保存用来排序(比较)的值
int j;
for(int i=1;i<len;i++)
{
tmp=arr[i];//保存第i个值
for(j=i-1;j>=0;j--)//依次将第i个值(tmp),与前面的数进行比较
{
if(arr[j]>tmp)//如果前面的值比tmp大,就将其向后移一个,然后接着与前面的值进行比较
{
arr[j+1]=arr[j];
}
else//如果前面的值比tmp小,就说明第i个值已经在合适的位置了,也就是说它前面的(包括他在内)所有的数有序了
{
break;
}
}
arr[j+1]=tmp;//此时j+1下标位置就是第i搁置合适的位置
}
}
void Show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int arr[]= {2,5,4,9,3,1,0,7,8,6};
int len=sizeof(arr)/sizeof(arr[0]);
InsertSort(arr,len);
Show(arr,len);
}
时间复杂度O(N^2)
空间复杂度:O(1)
稳定性:稳定
算法特点:越有序越快
二.希尔排序
算法思想
1.先预排序:取一个小于N的整数gap作为第一次增量,然后将距离gap的元素放入一组,再对每一组进行直接插入排序。然后将gap缩小,作为第二增量,重复以上操作。
2.再直接插入排序:当gap缩小为1时,进行直接插入排序
3.希尔排序利用了gap越大,挪动数据的距离越大,效率更高;gap越小,挪动的距离越小,前面让gap较大,可以让数据更快的挪动到自己对应的位置附近,减少挪动次数,让数据部分有序,利用直接插入排序越有序越快的特性。
代码实现
//利用直接插入排序的思想只是将两个数从相邻变为相距gap
static void Shell(int* arr, int len, int gap)
{
int tmp;
int j;
for (int i = gap; i < len; i++)
{
tmp = arr[i];
for (j = i - gap; j >= 0; j -= gap)
{
if (arr[j] > tmp)
{
arr[j + gap] = arr[j];
}
else
{
break;
}
}
arr[j + gap] = tmp;
}
}
void ShellSort(int* arr, int len)
{
int d[] = { 5,3,1 };//分组数,最后一个一定为1
for (int i = 0; i < sizeof(d) / sizeof(d[0]); i++)
{
Shell(arr, len, d[i]);
}
}