线性链表排序
来源:互联网 发布:年轻员工管理知乎 编辑:程序博客网 时间:2024/06/05 16:21
老师讲排序的时候讲到插入排序里的二分排序和表插入排序,
二分插入排序的特点是比较次数少,移动次数多;
表插入排序的特点的是比较次数多,移动次数少;
于是我在想一种介于二分插入排序和表插入排序之间的排序算法,结合两种算法的优点,于是诞生了二分表插入排序。
但是在不断的实践和思考中,我发现这种算法并不适合于插入排序,算法复杂度、空间复杂度、时间复杂度皆较高(和老师探讨之后,老师说这种算法挺有意思的,但并没有什么卵用,23333)。
简单来说就是构造一个结构体指针数组,然后 指针指来指去balalalala 最后我给这种算法改名为线性链表排序法 233333
这种算法的优点是:可以查看未排序之前的顺序,具有稳定性和适应性。
给出C语言实现:线性链表排序法
#ifndef _SECLISTSORT_H_#define _SECLISTSORT_H_struct Node;typedef char DataType;struct Node{ int key; DataType info; struct Node* next;};typedef struct Node* pNode;struct NodeArray{ int m; pNode* pn;};typedef struct NodeArray* pNodeArray;pNodeArray createNodeArray(int m,int ak[],pNode ptop);void binListSort(pNodeArray pan,pNode ptop);#endif // _SECLISTSORT_H_线性链表排序法C文件
#include "seqlistsort.h"#include <malloc.h>#include <stdio.h>pNodeArray createNodeArray(int m,int ak[],pNode ptop){ int i = 0; pNodeArray pan; pan = (pNodeArray)malloc(sizeof(struct NodeArray)); if(pan){ pan->m = 0; pan->pn = (pNode)malloc(sizeof(struct Node)*m); if(pan->pn){ while(i<m){ pan->pn[i]=(struct Node*)malloc(sizeof(struct Node)); if(pan->pn[i]) pan->m++; pan->pn[i]->key = ak[i]; i++; } i=0; while(i<m-1){ pan->pn[i]->next=pan->pn[i+1]; i++; } pan->pn[i]->next = NULL; } ptop->next = pan->pn[0]; return pan; } else free(pan); printf("Out of space!\n"); return NULL;}void binListSort(pNodeArray pan,pNode ptop){ pNode now,pre,p,q; pre = ptop->next; if (pre == NULL) return ; now = pre->next; if(now == NULL) return ; while(now){ q = ptop;p = ptop->next; while(p!=now && p->key <= now->key){q = p,p = p->next;} if(p == now){pre = pre->next;now = pre->next;continue;} pre->next = now->next; q->next = now;now->next = p; now = pre->next; }}主文件C:
#include <stdio.h>#include <stdlib.h>#include "seqlistsort.h"int main(){ int ak[]={1,3,2,4,6,5,0,9,7,8}; int i; pNode pt=(pNode)malloc(sizeof(struct Node)); //链表头结点指针(没有特别构造一个头结点结构体) pNode p=(pNode)malloc(sizeof(struct Node));; pNodeArray pan = createNodeArray(10,ak,pt); for(i=0;i<10;i++) //未排序序列 printf("%d ",pan->pn[i]->key); printf(" 未排序序列\n"); binListSort(pan,pt); //排序 p = pt->next; while(p){ //线性链表排序后序列 printf("%d ",p->key); p=p->next; } printf(" 线性链表排序后序列\n"); for(i=0;i<10;i++) //原未排序序列 printf("%d ",pan->pn[i]->key); printf(" 原未排序序列\n"); return 0;}输出结果:
然后你会机智的发现 这似乎真的没什么卵用 -。-
可是很多东西刚创造出来的就是没有什么意义的啊 但是说不定有一天就改变世界了呢 (小伙子你膨胀了) 23333
1 0
- 线性链表排序
- 线性表排序
- 线性表的插入排序
- 线性表的交换排序
- 线性表的选择排序
- 线性表的归并排序
- 排序。。。用于排序的线性表
- java 链表形式线性表插入排序
- 线性链表的应用----箱排序和基数排序
- 线性排序
- Uva 10152 - ShellSort//排序,线性表
- 线性表排序(C语言版)
- 线性排序之记数排序
- 排序---->在线性时间内排序
- 排序---->在线性时间内排序
- 线性排序之计数排序
- 线性排序之:计数排序
- 线性排序之计数排序
- 微信帐号相关总结
- 使用VirtualBox在Ubuntu下虚拟Windows XP共享文件夹设置方法
- 基于注解的struts action跳转 @Result 跳转到另一个action
- 斐波那契数列
- bfs 迷宫输出最短路径
- 线性链表排序
- python 识别验证码
- centos 7 安装与配置java
- IOS 开发 手势使用
- 基本名字与地址转换
- SQL SERVER 字符串函数
- RabbitMQ从入门到精通
- I/O复用
- Kali手记