您的位置:首页 > 编程语言 > C语言/C++

C语言直接插入排序和折半插入排序算法的实现

2017-01-22 11:34 531 查看
直接插入排序是是一种稳定的排序,其算法简便,适用于顺序结构和链式结构,更适合于基本有序(正序)的情况。其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现算法:

先是预定义和类型定义:

typedef int Status;
typedef int ElemType;

typedef struct{
ElemType *data;
int length;
}SqList;

创建链表:

Status EnSqList(SqList *L, ElemType e, int n)
{
L->data[n + 1] = e;
L->length++;
return OK;
}

直接插入排序:

void InsertSort(SqList *L)
{
int i, j;
for (i = 2; i <= L->length; i++)
{
if (L->data[i] < L->data[i - 1])
{
L->data[0] = L->data[i];
L->data[i] = L->data[i - 1];
for (j = i - 2; L->data[j]>L->data[0]; j--)
L->data[j + 1] = L->data[j];
L->data[j + 1] = L->data[0];
}
}
}

先让i等于2(只有一个元素的话没有必要排序),判断i下标的值是否比它前一个值要小,若是,则将i下标的值保存在下标为0的元素中,并让前一位元素后移一位(移动到i的位置)。之后利用循环判断之前的值是否比0号元素大,若是,则后移,直到遇到元素比0号元素小的,则将0号元素保存在比它小元素的下一个节点。

加入main():

int main(void)
{
SqList L;
ElemType e;
int i, n;
L.data = (int *)malloc(sizeof(int)*MVNum);
L.length = 0;
printf("输入元素个数:");
scanf("%d", &n);
printf("输入各个元素:");
for (i = 1; i <= n; i++)
{
scanf("%d", &e);
EnSqList(&L, e, L.length);
}
InsertSort(&L);
for (i = 1; i <= L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
return 0;
}



折半插入排序也是一种稳定的排序,不可作用于链式储存结构,适合用于初始值无序,且n值比较大的情况。其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现代码:

首先预定义和类型定义:

#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

typedef struct{
ElemType *data;
int length;
}SqList;

创建链表:

Status EnSqList(SqList *L,ElemType e,int n)
{
if (L->length >= n)
return ERROR;
L->data[L->length + 1] = e;
L->length++;
return OK;
}

折半插入排序算法:

void BInsertSort(SqList *L)
{
int i, j, mid, high, low;
for (i = 2; i <= L->length; i++)
{
low = 1;
high = i - 1;
L->data[0] = L->data[i];
while (low <= high)
{
mid = (low + high) / 2;
if (L->data[0] < L->data[mid])
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; j--)
L->data[j + 1] = L->data[j];
L->data[high + 1] = L->data[0];
}
}

从下标为2的元素开始(只有一个元素的话根本就没必要排序),让下标为0的元素储存下标为i元素的值,并初始化low为1,high为i-1。当low小于或等于high的时候,未确定插入位置,由于i之前的元素肯定有序,则利用折半的方法确定插入位置。让后将下标等于high之前的元素值都后移一位。让后将下标为0的元素(原来要排序的元素)插入到下标为high+1的位置。

加入main():

int main(void)
{
SqList L;
int n, i;
ElemType e;
L.length = 0;
printf("输入元素个数:");
scanf("%d", &n);
L.data = (int *)malloc(sizeof(int)*n);
printf("输入各个元素的值:");
for (i = 0; i < n; i++)
{
scanf("%d", &e);
EnSqList(&L, e, n);
}
BInsertSort(&L);
for (i = 1; i <= n; i++)
printf("%d ", L.data[i]);
printf("\n");
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息