插入排序是把一个记录插入到有序序列中,仍使该序列有序,并且长度增加1。
插入排序中最简单的排序方法是直接插入排序。
头文件及其他函数代码见https://blog.csdn.net/qq_42379345/article/details/81366150
直接插入排序函数
int ListInsertSort(SqList *list, ElemType elem, int (*p)(ElemType, ElemType))
{
int i, j;
if(NULL == list || NULL == list->elem)
{
return FAILURE;
}
if(list->length >= SIZE)
{
return FAILURE;
}
for(i = 0; i < list->length; i++)
{
if( TRUE == (*p)( elem, list->elem[i]) ) //找到正确位置
{
for(j = list->length; j > i; j-- ) //记录后移
{
list->elem[ j ] = list->elem[ j - 1 ];
}
list->elem[i] = elem;
list->length++;
return SUCCESS;
}
}
list->elem[ list->length ] = elem;
list->length++;
return SUCCESS;
}
测试代码
#include<stdio.h>
#include<stdlib.h>
#include "sequencelist.h"
#include<time.h>
void print(ElemType elem)
{
printf("%d ", elem);
}
int compare(ElemType L_elem, ElemType elem)
{
if(L_elem == elem)
{
return EQUAL;
}
else if(L_elem > elem)
{
return GREATER;
}
else
{
return LESS;
}
}
int main()
{
SqList L;
int ret, i;
ElemType elem;
srand(time(NULL));
ret = ListInit(&L);
if(SUCCESS == ret)
{
printf("Init success.\n");
}
else
{
printf("Init failure.\n");
}
for(i = 0; i < 12; i++)
{
ret = ListInsertSort(&L, rand() % 10, LT);
if(SUCCESS == ret)
{
printf("Insert success.\n");
}
else
{
printf("Insert failure.\n");
}
}
ret = ListTraverse(L,print);
if( FAILURE == ret)
{
printf("\nTraverse failure.\n");
}
else
{
printf("\nTraverse success.\n");
}
return 0;
}