第二个例子:单链表实现基排序(桶排序)
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
第二个例子:单链表实现基排序(桶排序)相关推荐
- 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序
养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...
- 记数排序 桶排序 基数排序
为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...
- 算法知识点-排序-桶排序
Notes:在面试过程中,除非明显声明,一般时间复杂度都是基于比较的排序. 桶排序 桶排序是一种排序的思想,它指的是不基于比较的排序,而是利用桶来完成排序的工作,之前介绍的冒泡,选择,插入,快排,堆排 ...
- java排序——桶排序
2019独角兽企业重金招聘Python工程师标准>>> package jxau.blueDot.lyx;import java.util.ArrayList; import jav ...
- c语言单链表递增排序,单链表 基本操作(元素递增排序)
题目描述: 有一个带头节点的单链表L(至少有一个数据节点),设计一个算法使其元素递增有序排列. 解题思路: 由于单链表L中有一个以上的数据节点,首先构造一个只含有头结点和首节点的有序单链表(只含有一个 ...
- 数据结构第二章(单链表部分)学习笔记
线性表---单链表部分 1.知识承接 顺序表可以随时存取表中的任意一个元素,它的存储位置可以用一个简单直观的公式来表示.但效率低插入和删除操作需要移动大量的元素.临时扩大存储空间有困难,存储分配只能预 ...
- 字符串的冒泡排序c语言,c语言单链表冒泡排序_c语言字符串排序冒泡法_c语言链表排序...
1. #include 2. 3. struct Node; 4. 5. typedef struct Node *PtrToNode; 6. typedef PtrToNode List; 7. t ...
- 宇宙最简单排序:桶排序
目录 介绍: 我的程序: 介绍: c++的排序方法非常多,比如啥冒泡啊.选择啊.插入啊......,有时候编游戏也用到排序,但我是一个很勤(lan)快(duo)的人,想用冒泡什么的忒麻烦了,复杂度又高 ...
- 史上最简单的排序-桶排序
原谅我很久都没发作品,主要是本羊羔遇到了点棘手的问题-- 话不多说,进入正题: 目录 题目 精讲桶排概念 实际生活->举例 计算机语言->举例 代码和题目 题目 我们需要给n个自然数排序( ...
最新文章
- C语言--static全局使用示例
- REST framework 权限管理源码分析
- TensorFlow2.0(七)--基础API使用
- spring框架总结
- Facebook人工智能实验室的前世今生
- 案例-分页按钮(CSS3)
- A Better Finder Attributes 7 Mac版(文件批量重命名)
- 嵌入式系统应用开发实验(三): Verilog编程使VGA图像输出
- 网关报错:com.netflix.zuul.exception.ZuulException: Filter threw Exception,调用服务和网关陷入死循环,重复报相同的错误
- linux配置tp路由器,手把手图解教程tplink r402m路由器配置
- springboot之shiro
- MFC 按钮控件添加图片
- 一文了解Java强制类型转换
- 关于海神阁阁主真实身份的推测
- 视频格式转换器哪个好?用什么软件转换格式
- 如何实现python自动打开B站视频并点赞?循环版
- python语言中find是什么意思_Python find()函数是什么?
- Google Chrome 63正式版下载
- html5自带文字转语音,原来电脑自带有文字转语音方法,只需一个键,再也不担心要配音了...
- 主流多媒体制作软件一览
热门文章
- 2020.12.17
- Ubuntu 20.04系统中安装vncserver的方法步骤
- Linux常用系统备份、恢复命令
- oracle按时间要求查询
- java.IO字节流和字符流详解
- html输入邮箱的文本框,自动生成邮箱号并填入input输入框的实现方法
- python 去除字符串的标点符号 用_7步搞定数据清洗-Python数据清洗指南
- Java设计模式(十一):组合设计模式
- Java高并发编程(二):Java并发机制的底层实现机制
- android 除了webview 浏览器控件,AgentWeb是基于Android WebView一个功能完善小型浏览器库...