线性链表排序

老师讲排序的时候讲到插入排序里的二分排序表插入排序,

二分插入排序的特点是比较次数少,移动次数多;

表插入排序的特点的是比较次数多,移动次数少;

于是我在想一种介于二分插入排序和表插入排序之间的排序算法,结合两种算法的优点,于是诞生了二分表插入排序

但是在不断的实践和思考中,我发现这种算法并不适合于插入排序,算法复杂度空间复杂度时间复杂度皆较高(和老师探讨之后,老师说这种算法挺有意思的,但并没有什么卵用,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





  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值