(图片别看错了,右边的是输出样例)
前几天学了学链表,也把一些ADT格式敲了敲,但是还是没有实际用过
然后就选了一道排序题,顺便试了试插入排序
以前只知道有插入排序这个东西,但是用数组实现的话感觉效率会偏低,现在知道链表之后就知道该怎么玩了(乐)
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{ElemType data;ElemType ID;struct LNode * next;
}LinkList;LinkList * creat(int n)
{LinkList * head, * node, * end;//定义头节点,普通节点,尾部节点head = (LinkList *)malloc(sizeof(LinkList));//分配地址end = head;for(int i = 0; i < n; i++){node = (LinkList *)malloc(sizeof(LinkList));//分配地址scanf("%d%d", &node->ID, &node->data);end->next = node;end = node;}end->next = NULL;//结束创建return head;
}//创建长度为n的链表
void DestroyList(LinkList * head)
{LinkList * end = head;do{end = end->next;free(head);head = end;}while(end != NULL);return;
}//销毁链表int main(void)
{int N;scanf("%d", &N);LinkList * head = creat(1);//插入排序for(int i = 1; i < N; i++){int t_ID, t_data;scanf("%d%d", &t_ID, &t_data);for(LinkList * node = head->next, * f_node = head; 1; node = node->next, f_node = f_node->next){if(node == NULL || t_data > node->data || (t_data == node->data && t_ID < node->ID)){LinkList * tmp = (LinkList *)malloc(sizeof(LinkList));f_node->next = tmp, tmp->next = node;tmp->data = t_data, tmp->ID = t_ID;break;}}}//输出int tmp = 1, count = 1;for(LinkList * node = head->next, * f_node = head; 1; ){printf("%d %d %d\n", tmp, node->ID, node->data);node = node->next, f_node = f_node->next;if(node == NULL) break;else{count++;if(f_node->data > node->data) tmp = count;}}DestroyList(head);return 0;
}
效率还是比较高的(不知道是不是我的错觉),对1000个数据进行排序的时间不超过8ms
一些废话:
昨天晚上上思政课,差点给我干昏过去,整什么课上辩论赛,还要提问,太抽象了,我一个理科生看着马院等等院的大佬在那边讲什么因然,什么实然。能不能对我这种不对哲学有一点点兴趣的绯雾温柔点,md我看算法书都惊心胆颤
辩题是有没有普适(世)性的价值观,在那边咬文嚼字
简单来说不就是证明存在性的问题嘛,那坚持存在的一方举出例子,反方争辩不存在不就行了(doge)
所以说这种东西就是不如高数让我感觉脚踏实地,果然我不是学文科的料