老师讲排序的时候讲到插入排序里的二分排序和表插入排序,
二分插入排序的特点是比较次数少,移动次数多;
表插入排序的特点的是比较次数多,移动次数少;
于是我在想一种介于二分插入排序和表插入排序之间的排序算法,结合两种算法的优点,于是诞生了二分表插入排序。
但是在不断的实践和思考中,我发现这种算法并不适合于插入排序,算法复杂度、空间复杂度、时间复杂度皆较高(和老师探讨之后,老师说这种算法挺有意思的,但并没有什么卵用,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