线性链表排序

来源:互联网 发布:年轻员工管理知乎 编辑:程序博客网 时间: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