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

来源:互联网 发布:温碧霞 妲己 知乎 编辑:程序博客网 时间:2024/04/26 15:05

直接插入排序是是一种稳定的排序,其算法简便,适用于顺序结构和链式结构,更适合于基本有序(正序)的情况。其空间复杂度为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 0typedef 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;elselow = 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;}



0 0