2019独角兽企业重金招聘Python工程师标准>>>

//单链表基排序(桶排序)
//main.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include "List.h"
#include<stdbool.h>void Create_barrel(List *L);
void input_barrel(List *L,int val);
int output_barrel(List *L);int main(void)
{int data[]={64,8,216,512,27,729,0,1,343,125}; int JPX_num=0;    //基排序进行次数              int j;int i;int WEI;    //个十百位 int LEN;        // 数组大小 int k;int Yushu;     //余数 int power=1;   //10的倍数 LEN=sizeof(data)/(sizeof(int));       //数组中数据个数 bool Jiaoyan=1;      //最大的位数 List barrel_num[10];     //0-10的桶 while(Jiaoyan){Jiaoyan=0; for(j=0;j<LEN;j++){WEI=(data[j]/power)%10;Jiaoyan=Jiaoyan||WEI;                     //获取数组里元素的最高位数 }power*=10;JPX_num++;}JPX_num-=1;for(j=0;j<10;j++){Create_barrel(&barrel_num[j]);                 //为每个桶生成空链表,用于存储之后数据 }//排序power=1;for(j=0;j<JPX_num;j++){for(i=0;i<LEN;i++){Yushu=(data[i]/power)%10;input_barrel(&barrel_num[Yushu],data[i]);            //把数依次入桶 }k=0;for(i=0;i<10;i++){while(!IsEmpty(barrel_num[i])){data[k]=output_barrel(&barrel_num[i]);          //入完桶后依次出桶,已准备下一次如同排序 k++;}}power*=10;} for(i=0;i<LEN;i++){printf("%d ",data[i]);                      //打印排序后的数组 }
}void Create_barrel(List *L)
{*L=(List)malloc(sizeof(struct Node));      //创建0-9共10个桶 (*L)->Next=NULL;
}void input_barrel(List *L,int val)
{InsertH(val,*L,*L);                    //入桶(相当于单链表的后插)
}
int output_barrel(List *L)
{List m;m=(*L)->Next;int a=m->Element;                      //出桶(相当于单链表从第一个元素依次删除) (*L)->Next=(*L)->Next->Next;free(m);return a;
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//List.h
#ifndef _LIST_H_
typedef int ElementType;struct Node;typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;struct Node
{ElementType Element;Position Next;
};void CreateList(List *L,int n);
void PrintList(List L);List MakeEmpty(List L);
int IsEmpty(List L);
void CreateEmptyList(List *L);
int IsLast(Position P,List L);
Position Find(ElementType X,List L);
void Delete(ElementType X,List L);
Position FindPrevious(ElementType X,List L);
void Insert(ElementType X,List L,Position P);
void InsertH(ElementType X,List L,Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);#endif
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//List.c
#include "List.h"
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>/*struct Node
{ElementType Element;Position Next;
};*/void CreateList(List *L,int n)
{Position P,P1;int i;*L=(Position)malloc(sizeof(struct Node));(*L)->Next=NULL;P1=*L;printf("请输入%d个数据:\n",n);                    //没问题 for(i=n;i>0;i--){//P=(Position)malloc(sizeof(struct Node));//scanf("%d",&P->Element);                //前插 //P->Next=(*L)->Next;//(*L)->Next=P;P=(Position)malloc(sizeof(struct Node));scanf("%d",&P->Element);P->Next=P1->Next;                       //后插 P1->Next=P;P1=P;}
}void PrintList(List L)
{printf("已保存链表\n");Position P;P=L->Next;while(P->Next!=NULL){printf("%d ",P->Element);              //没问题 P=P->Next;}printf("%d ",P->Element);
}void FatalError(char a[])
{printf("%s",a);                           //没问题
}int IsEmpty(List L)
{return L->Next==NULL;                     //没问题
}int IsLast(Position P,List L)
{return P->Next==NULL;
}List MakeEmpty(List L)
{List q,p;p=L->Next;while(p!=NULL){                                            //没问题 q=p->Next;free(p);p=q;}L->Next=NULL;return L;
}Position Find(ElementType X,List L)
{Position P;P=L->Next;while((P->Next!=NULL)&&(P->Element!=X))        //没问题 {P=P->Next;}return P;
}Position findPrevious(ElementType X,List L)
{Position P;P=L;while((P->Next!=NULL)&&(P->Next->Element!=X))    //没问题 {P=P->Next;}return P;
}void Delete(ElementType X,List L)
{Position P,TmpCell;P=findPrevious(X,L);if(!IsLast(P,L)){TmpCell=P->Next;P->Next=TmpCell->Next;                   //没问题 free(TmpCell);}
}
void DeleteList(List L)
{Position P,Q;P=L->Next;L->Next=NULL;while(P!=NULL){Q=P->Next;                               //没问题 free(P);P=Q;}
}
void Insert(ElementType X,List L,Position P)
{if(L==NULL){return;} Position TmpCell;TmpCell=malloc(sizeof(struct Node));if(TmpCell!=NULL){TmpCell->Next=P->Next;                   //前插,没问题 TmpCell->Element=X;P->Next=TmpCell;}else{FatalError("out of space!!!");}
}
void InsertH(ElementType X,List L,Position P)
{if(L==NULL){return;} Position TmpCell;List q;TmpCell=malloc(sizeof(struct Node));q=L;                                            //后插,没问题 while(q->Next!=NULL){q=q->Next;}q->Next=TmpCell;TmpCell->Next=NULL;TmpCell->Element=X;
}
void CreateEmptyList(List *L)
{*L=(Position)malloc(sizeof(struct Node));(*L)->Next=NULL;
}

//List.h
#ifndef _LIST_H_
typedef int ElementType;

struct Node;

typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

struct Node
{
    ElementType Element;
    Position Next;
};

void CreateList(List *L,int n);
void PrintList(List L);

List MakeEmpty(List L);
int IsEmpty(List L);
void CreateEmptyList(List *L);
int IsLast(Position P,List L);
Position Find(ElementType X,List L);
void Delete(ElementType X,List L);
Position FindPrevious(ElementType X,List L);
void Insert(ElementType X,List L,Position P);
void InsertH(ElementType X,List L,Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);

#endif

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//List.c
#include "List.h"
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

/*struct Node
{
    ElementType Element;
    Position Next;
};*/

void CreateList(List *L,int n)
{
    Position P,P1;
    int i;
    *L=(Position)malloc(sizeof(struct Node));
    (*L)->Next=NULL;
    P1=*L;
    printf("请输入%d个数据:\n",n);                    //没问题 
    for(i=n;i>0;i--)
    {
        //P=(Position)malloc(sizeof(struct Node));
        //scanf("%d",&P->Element);                //前插 
        //P->Next=(*L)->Next;
        //(*L)->Next=P;
        
        P=(Position)malloc(sizeof(struct Node));
        scanf("%d",&P->Element);
        P->Next=P1->Next;                       //后插 
        P1->Next=P;
        P1=P;
    
    }
}

void PrintList(List L)
{
    printf("已保存链表\n");
    Position P;
    P=L->Next;
    while(P->Next!=NULL)
    {
        printf("%d ",P->Element);              //没问题 
        P=P->Next;
    }
    printf("%d ",P->Element);
}

void FatalError(char a[])
{
    printf("%s",a);                           //没问题 
}

int IsEmpty(List L)
{
    return L->Next==NULL;                     //没问题 
}

int IsLast(Position P,List L)
{
    return P->Next==NULL; 
}

List MakeEmpty(List L)
{
    List q,p;
    p=L->Next;
    while(p!=NULL)
    {                                            //没问题 
        q=p->Next;
        free(p);
        p=q;
        
    }
    L->Next=NULL;
    
    return L;
}

Position Find(ElementType X,List L)
{
    Position P;
    P=L->Next;
    while((P->Next!=NULL)&&(P->Element!=X))        //没问题 
    {
        P=P->Next;
    }
    
    return P;
}

Position findPrevious(ElementType X,List L)
{
    Position P;
    P=L;
    while((P->Next!=NULL)&&(P->Next->Element!=X))    //没问题 
    {
        P=P->Next;
    }
    
    return P;
}

void Delete(ElementType X,List L)
{
    Position P,TmpCell;
    P=findPrevious(X,L);
    if(!IsLast(P,L))
    {
        TmpCell=P->Next;
        P->Next=TmpCell->Next;                   //没问题 
        free(TmpCell);
    }
}
void DeleteList(List L)
{
    Position P,Q;
    P=L->Next;
    L->Next=NULL;
    while(P!=NULL)
    {
        Q=P->Next;                               //没问题 
        free(P);
        P=Q;
    }
}
void Insert(ElementType X,List L,Position P)
{
    if(L==NULL)
    {
        return;
    } 
    Position TmpCell;
    TmpCell=malloc(sizeof(struct Node));
    if(TmpCell!=NULL)
    {
        TmpCell->Next=P->Next;                   //前插,没问题 
        TmpCell->Element=X;
        P->Next=TmpCell;
    }
    else
    {
        FatalError("out of space!!!");
    } 
}
void InsertH(ElementType X,List L,Position P)
{
    if(L==NULL)
    {
        return;
    } 
    Position TmpCell;
    List q;
    TmpCell=malloc(sizeof(struct Node));
    q=L;                                            //后插,没问题 
    while(q->Next!=NULL)
    {
        q=q->Next;
    }
    q->Next=TmpCell;
    TmpCell->Next=NULL;
    TmpCell->Element=X;
}
void CreateEmptyList(List *L)
{
    *L=(Position)malloc(sizeof(struct Node));
    (*L)->Next=NULL;
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//单链表基排序(桶排序) 
//main.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include "List.h"
#include<stdbool.h>

void Create_barrel(List *L);
void input_barrel(List *L,int val);
int output_barrel(List *L);

int main(void)
{
    int data[]={64,8,216,512,27,729,0,1,343,125}; 
    int JPX_num=0;    //基排序进行次数              
    int j;
    int i;
    int WEI;    //个十百位 
    int LEN;        // 数组大小 
    int k;
    int Yushu;     //余数 
    int power=1;   //10的倍数 
    LEN=sizeof(data)/(sizeof(int));       //数组中数据个数 
    bool Jiaoyan=1;      //最大的位数 
    List barrel_num[10];     //0-10的桶 
               
    while(Jiaoyan)
    {
        Jiaoyan=0; 
        for(j=0;j<LEN;j++)
        {
            WEI=(data[j]/power)%10;
            Jiaoyan=Jiaoyan||WEI;                     //获取数组里元素的最高位数 
        }
        power*=10;
        JPX_num++;
    }
    JPX_num-=1;
     
    for(j=0;j<10;j++)
    {
        Create_barrel(&barrel_num[j]);                 //为每个桶生成空链表,用于存储之后数据 
    }
    //排序
    power=1;
    for(j=0;j<JPX_num;j++)
    {
        for(i=0;i<LEN;i++)
        {
            Yushu=(data[i]/power)%10;
            input_barrel(&barrel_num[Yushu],data[i]);            //把数依次入桶 
        }
        k=0;
        for(i=0;i<10;i++)
        {
            while(!IsEmpty(barrel_num[i]))
            {
                data[k]=output_barrel(&barrel_num[i]);          //入完桶后依次出桶,已准备下一次如同排序 
                k++;
            }
        }
        power*=10;
    } 
    
    for(i=0;i<LEN;i++)
    {
        printf("%d ",data[i]);                      //打印排序后的数组 
    }
}

void Create_barrel(List *L)
{
    *L=(List)malloc(sizeof(struct Node));      //创建0-9共10个桶 
    (*L)->Next=NULL;
}

void input_barrel(List *L,int val)
{
    InsertH(val,*L,*L);                    //入桶(相当于单链表的后插) 

int output_barrel(List *L)
{
    List m;
    m=(*L)->Next;
    int a=m->Element;                      //出桶(相当于单链表从第一个元素依次删除) 
    (*L)->Next=(*L)->Next->Next;
    free(m);
    return a;
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

输入数组:int data[]={64,8,216,512,27,729,0,1,343,125};

排序结果:0 1 8 27 64 125 216 343 512 729
--------------------------------
Process exited after 0.03693 seconds with return value 10
请按任意键继续. . .

转载于:https://my.oschina.net/u/3397950/blog/872539

第二个例子:单链表实现基排序(桶排序)相关推荐

  1. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  2. 记数排序 桶排序 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  3. 算法知识点-排序-桶排序

    Notes:在面试过程中,除非明显声明,一般时间复杂度都是基于比较的排序. 桶排序 桶排序是一种排序的思想,它指的是不基于比较的排序,而是利用桶来完成排序的工作,之前介绍的冒泡,选择,插入,快排,堆排 ...

  4. java排序——桶排序

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.blueDot.lyx;import java.util.ArrayList; import jav ...

  5. c语言单链表递增排序,单链表 基本操作(元素递增排序)

    题目描述: 有一个带头节点的单链表L(至少有一个数据节点),设计一个算法使其元素递增有序排列. 解题思路: 由于单链表L中有一个以上的数据节点,首先构造一个只含有头结点和首节点的有序单链表(只含有一个 ...

  6. 数据结构第二章(单链表部分)学习笔记

    线性表---单链表部分 1.知识承接 顺序表可以随时存取表中的任意一个元素,它的存储位置可以用一个简单直观的公式来表示.但效率低插入和删除操作需要移动大量的元素.临时扩大存储空间有困难,存储分配只能预 ...

  7. 字符串的冒泡排序c语言,c语言单链表冒泡排序_c语言字符串排序冒泡法_c语言链表排序...

    1. #include 2. 3. struct Node; 4. 5. typedef struct Node *PtrToNode; 6. typedef PtrToNode List; 7. t ...

  8. 宇宙最简单排序:桶排序

    目录 介绍: 我的程序: 介绍: c++的排序方法非常多,比如啥冒泡啊.选择啊.插入啊......,有时候编游戏也用到排序,但我是一个很勤(lan)快(duo)的人,想用冒泡什么的忒麻烦了,复杂度又高 ...

  9. 史上最简单的排序-桶排序

    原谅我很久都没发作品,主要是本羊羔遇到了点棘手的问题-- 话不多说,进入正题: 目录 题目 精讲桶排概念 实际生活->举例 计算机语言->举例 代码和题目 题目 我们需要给n个自然数排序( ...

最新文章

  1. C语言--static全局使用示例
  2. REST framework 权限管理源码分析
  3. TensorFlow2.0(七)--基础API使用
  4. spring框架总结
  5. Facebook人工智能实验室的前世今生
  6. 案例-分页按钮(CSS3)
  7. A Better Finder Attributes 7 Mac版(文件批量重命名)
  8. 嵌入式系统应用开发实验(三): Verilog编程使VGA图像输出
  9. 网关报错:com.netflix.zuul.exception.ZuulException: Filter threw Exception,调用服务和网关陷入死循环,重复报相同的错误
  10. linux配置tp路由器,手把手图解教程tplink r402m路由器配置
  11. springboot之shiro
  12. MFC 按钮控件添加图片
  13. 一文了解Java强制类型转换
  14. 关于海神阁阁主真实身份的推测
  15. 视频格式转换器哪个好?用什么软件转换格式
  16. 如何实现python自动打开B站视频并点赞?循环版
  17. python语言中find是什么意思_Python find()函数是什么?
  18. Google Chrome 63正式版下载
  19. html5自带文字转语音,原来电脑自带有文字转语音方法,只需一个键,再也不担心要配音了...
  20. 主流多媒体制作软件一览

热门文章

  1. 2020.12.17
  2. Ubuntu 20.04系统中安装vncserver的方法步骤
  3. Linux常用系统备份、恢复命令
  4. oracle按时间要求查询
  5. java.IO字节流和字符流详解
  6. html输入邮箱的文本框,自动生成邮箱号并填入input输入框的实现方法
  7. python 去除字符串的标点符号 用_7步搞定数据清洗-Python数据清洗指南
  8. Java设计模式(十一):组合设计模式
  9. Java高并发编程(二):Java并发机制的底层实现机制
  10. android 除了webview 浏览器控件,AgentWeb是基于Android WebView一个功能完善小型浏览器库...