插入排序是通过将当前第i个待排元素i与数组前i-1个已经有序的元素j进行两两比较,如果j元素小于i,将i插在j元素的后面
/*排序过程中涉及的存储器不同,将排序方法分为两大类:一类是内部排序
指的是待排序记录存放在计算机随机存储器中的排序过程 另外一类是外部排序
指的是待排序记录的数量很大,以至于内存不能一次容纳全部记录,在排序过程中尚需对
外存进行访问的排序过程*/
//直接插入排序
#include<stdio.h>
/*
void InsertSort(int *arr,int len)//未优化的插入排序,在数据基本有序的情况下时间复杂度还是O(n^2),
//空间复杂度为O(1) 两两比较(稳定)
//从前往后找第一个比他大的数据 插在它的前面(也就是放在他的位置 它及以后 的数据往后移动)
{
int i;
int j;
int tmp;
int k;
for(i=1;i<len;i++)//i为无序数列中的第一个数据
{
tmp=arr[i];
for(j=0;j<i;j++)
{
if(arr[j]>tmp)//j为找到的有序数列中第一个比tmp大的数字
{
break;
}
}
for(k=i-1;k>=j;k--)//因为i是待排序的数据 需要移动的数据为 j----》i-1
{
arr[k+1]=arr[k];
}
arr[j]=tmp;
}
}
*/
void InsertSort(int *arr,int len)
{
int i;
int j;
int tmp;
for(i=1;i<len;i++)
{
tmp=arr[i];
for(j=i-1;j>=0;j--)
{
if(arr[j]<=tmp)//从有序序列中找 第一个比他小的 这样在数据有序的情况下 可以减少时间复杂度
//越有序越快 稳定
{
break;
}
arr[j+1]=arr[j];
}
arr[j+1]=tmp;//找到第一个比他小的数据 放在此数据之后
}
}
int main()
{
int arr[]={5,9,0,23,45,78,65,4,2,1,3,9};
int len=sizeof(arr)/sizeof(arr[0]);
InsertSort(arr, len);
for(int i=0;i<len;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}