原题链接:数据结构-折半插入排序
解题思路:
为了便于理解,这里的代码和题目不一样
题目是在输入后的顺序表进行自身的折半插入排序
这里把过程拆开了:总思路是每输入一个元素,就在有序表里面用二分查找查找插入位置,之后直接插入到有序表里面,最后输出结果,起初有序表为空
1):有序表的定义
typedef struct List_{ int *Data; int length; /*有序表的实际长度,不是大小*/ }*List,LIST;
2):进行有序表初始化
void initi_(List L,int n)/*初始化有序表*/ { L->Data=(int *)malloc(n*sizeof(int)); L->length=0;/*有序表初始长度为0*/ }
3):用二分查找法查找插入位置,查找元素为key,返回为插入位置的下标
int Halfsreach(List L,int key) /*折半查找插入位置*/ { int Low=0,High=L->length-1; int Mid; while(Low<=High) /*在Low,High之间查找*/ { Mid=(Low+High)/2;/*求中间元素位置*/ if(L->Data[Mid]==key) return Mid; else if(key<L->Data[Mid]) High=Mid-1; else Low=Mid+1; } return Low;/*没找到时,返回的插入位置为Low*/ }
4):把元素插入到有序表中,address为插入的位置即下标
void Insert_sort(List L,int key,int address) /*插入元素*/ { for(int i=L->length-1;i>=address;i--)/*从最后一个元素到插入位置的元素,全部后移*/ { L->Data[i+1]=L->Data[i]; } L->Data[address]=key;/*插入元素*/ L->length++;/*有序表长度加1*/ }
参考代码:
#include<stdio.h> #include<malloc.h> typedef struct List_{ int *Data; int length; }*List,LIST; void initi_(List L,int n); int Halfsreach(List L,int key); void Insert_sort(List L,int key,int address); void print_(List L); /*---------------------------------------------------------*/ int main() { int n,key,address; LIST L; while(scanf("%d",&n)!=EOF) { initi_(&L,n); for(int i=0;i<n;i++) { scanf("%d",&key); /*输入元素*/ address=Halfsreach(&L,key);/*查找位置*/ Insert_sort(&L,key,address);/*插入元素*/ } print_(&L);/*输出有序序列*/ free(L.Data);/*释放空间*/ } return 0; } /*---------------------------------------------------------*/ void initi_(List L,int n)/*初始化有序表*/ { L->Data=(int *)malloc(n*sizeof(int)); L->length=0;/*有序表初始长度为0*/ } /*---------------------------------------------------------*/ int Halfsreach(List L,int key) /*折半查找插入位置*/ { int Low=0,High=L->length-1; int Mid; while(Low<=High) /*在Low,High之间查找*/ { Mid=(Low+High)/2;/*求中间元素位置*/ if(L->Data[Mid]==key) return Mid; else if(key<L->Data[Mid]) High=Mid-1; else Low=Mid+1; } return Low;/*没找到时,返回的插入位置为Low*/ } /*---------------------------------------------------------*/ void Insert_sort(List L,int key,int address) /*插入元素*/ { for(int i=L->length-1;i>=address;i--)/*从最后一个元素到插入位置的元素,全部后移*/ { L->Data[i+1]=L->Data[i]; } L->Data[address]=key;/*插入元素*/ L->length++;/*有序表长度加1*/ } /*---------------------------------------------------------*/ void print_(List L) { for(int i=0;i<L->length-1;i++) printf("%d ",L->Data[i]); printf("%d\n",L->Data[L->length-1]); }
别忘点赞哦-.-
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复