C语言直接插入排序和折半插入排序算法的实现
2017-01-22 11:34
531 查看
直接插入排序是是一种稳定的排序,其算法简便,适用于顺序结构和链式结构,更适合于基本有序(正序)的情况。其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现算法:
先是预定义和类型定义:
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *data;
int length;
}SqList;
创建链表:
直接插入排序:
先让i等于2(只有一个元素的话没有必要排序),判断i下标的值是否比它前一个值要小,若是,则将i下标的值保存在下标为0的元素中,并让前一位元素后移一位(移动到i的位置)。之后利用循环判断之前的值是否比0号元素大,若是,则后移,直到遇到元素比0号元素小的,则将0号元素保存在比它小元素的下一个节点。
加入main():
折半插入排序也是一种稳定的排序,不可作用于链式储存结构,适合用于初始值无序,且n值比较大的情况。其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现代码:
首先预定义和类型定义:
创建链表:
折半插入排序算法:
从下标为2的元素开始(只有一个元素的话根本就没必要排序),让下标为0的元素储存下标为i元素的值,并初始化low为1,high为i-1。当low小于或等于high的时候,未确定插入位置,由于i之前的元素肯定有序,则利用折半的方法确定插入位置。让后将下标等于high之前的元素值都后移一位。让后将下标为0的元素(原来要排序的元素)插入到下标为high+1的位置。
加入main():
先是预定义和类型定义:
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; }
相关文章推荐
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- 数据结构 查找及排序算法、直接插入排序及顺序查找(c语言实现)
- 直接插入排序(C语言实现)
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- C语言实现直接插入排序和希尔排序
- 排序【4】之直接插入排序的C语言实现
- 简单了解C语言中直接插入排序与直接选择排序实现
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- C语言实现选择排序、直接插入排序、冒泡排序的示例
- 直接插入排序(Straight Insertion Sort)的C语言实现
- C语言实现冒泡和直接插入排序
- 排序之一:直接插入排序(C语言实现)
- C语言实现直接插入排序
- 数据结构之---C语言实现直接插入排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 直接插入排序法(C语言实现)
- 直接插入排序(C语言)实现
- C语言实现直接插入排序
- C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- c语言实现直接插入排序(正序和逆序)