插入排序:
类似洗牌,将从1~N的数字分别插入到合适的位置,当然对于数组来说,需要做相应的移动。基础的方法是依次挪动,较为快捷的方法是memmove。
需要说明的是,按照Linux的man手册,memmove是支持内存overlap的,即可以部分重叠,函数内部会处理好其他的事情,因此类似书上的先移动到buffer,再从buffer移动到另一个位置是没必要的!
#include <stdio.h>
#include <string.h>
typedef int TYPE;
//Compare function
int cmp(TYPE a, TYPE b)
{
return a - b;
}
//Inser Sort & Move one by one
void insert_sort_1(TYPE* arr,int n,int (*cmp)(TYPE,TYPE))
{
int pos;
for(pos = 0; pos < n; pos ++ )
{
TYPE value = arr[pos];
int i;
for(i = pos -1; i>=0; i-- )
{
if(cmp(arr[i],value)<0)
{
break;
}
else
{
arr[i+1] = arr[i];
}
}
arr[i+1] = value;
}
}
//Insert sort & move by memmove
void insert_sort_2(TYPE* arr,int n,int (*cmp)(TYPE,TYPE))
{
size_t pos;
for( pos = 1 ; pos < n ; pos++ )
{
TYPE value = arr[pos];
int i = pos - 1;
int len;
while( i >= 0 && cmp( value , arr[i] ) < 0 ) { i--; }
len = sizeof(TYPE) * (pos - i - 1);
memmove( &(arr[i+2]) , &(arr[i+1]) , len );
arr[i+1] = value;
}
}
int main()
{
TYPE arr[8] = {1,3,2,5,8,12,0,3};
const int size = sizeof(arr)/sizeof(TYPE);
//Test for sort algorightm
//insert_sort_1(arr,size,cmp);
insert_sort_2(arr,size,cmp);
int i;
for(i=0;i<size;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}