插入排序算法的大概实现思路是这样的,从数组第2个元素开始抽取元素,把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边,迭代处理整个数组 ,选择适当的位置插入。
插入排序算的时间复杂度O(n2) ,空间复杂度,O(1) 稳定排序。
下面使用代码做简单演示
typedef unsigned int DataField;
/**
*插入排序
*/
void insert_sort(DataField* data, int len);
void show_data(DataField* data,int len);
void insert_sort(DataField* data, int len){
int i = 1;
for (i ; i < len ; i++)
{
/// 第一次遍历从第二个元素开始,默认第一个元素是排好序的
/// 取出临时变量,临时变量左侧的为已经排好序的元素,右侧为待排序的
DataField temp = *(data + i);
int insertIndex = i-1;
// 找到临时变量待插入的位置,用临时变量和左侧已经排好序的元素对比
while (insertIndex>=0 && temp<*(data+insertIndex))
{
insertIndex--;
}
///此时要插入的下标为 insertIndex +1
insertIndex = insertIndex +1;
/// 遍历临时变量左侧之待插入区间,将临时变量插入
int j = i;
for( j ; j > insertIndex ; j--){
*(data+j) = *(data + j -1);
}
*(data+insertIndex) = temp;
}
show_data(data,len);
}
void show_data(DataField *data, int len)
{
printf("-----------------\n");
int i = 0;
for (i; i < len; i++)
{
printf("%d\t",*(data+i));
}
printf("\n");
}
测试结果
void (*funPtr)(DataField*,int);
DataField arr[] ={ 19,29,49,69,99,39,9,79,89 };
DataField* data = &arr[0];
int len = sizeof(arr)/sizeof(DataField);
funPtr = &insert_sort;
(*funPtr)(data,len);