数据结构-排序-分配类排序-知识点总结归纳3

分配类排序:核心是分配和收集,利用关键字的优先级进行排序的思想 

高位优先排序:比如桥牌,先比较花色在比较面值;比如学号,比较级,院,班,号;

低位优先排序: 链式基数排序


思想:基于"分配"和"收集"的操作, 将单关键字转化为多关键字排序
将链表作为存储结构, 待排序记录以指针相连,构成链表;
分配:按照关键字取值分配记录到链队列相应队列中,每个队列关键字取值相同
收集:按照关键字大小,从小到大,将队列首尾相接连接成一个链表;
重复上述步骤..

定义:

 

//待排序记录结点
typedef struct node{int data;//比如说一个三位数 struct node *next;
}TNode;//队列首尾指针
typedef struct{node *front;node *rear;
}TPointer; 

 

//根据数组R[](已经存在元素),构建带头结点待排序记录链表
TNode *create_list(int R[], int n){TNode *p, *ph;//p为每一个存了记录的结点, ph为头结点ph = (TNode *)malloc(sizeof(TNode));if(!ph) return NULL; ph->next = NULL;int i;for(i = 0; i < n; i++){p = (TNode *)malloc(sizeof(TNode));if(!p) return NULL;p->data = R[i];//头插法插入 p->next = ph->next;ph->next = p;}return ph;//返回头结点 
} #define N 10
//分配算法,对三位数的记录序列按照关键字低位排序分配 
void dispatch(TNode *ph, TPointer *Q, int d){	//ph存记录, Q队列:存指针,d根据关键字到那一趟取值不同	TNode *p = NULL;//作为辅助空间拆分ph int i, idx;//初始化Qfor(i = 0; i < N; i++){Q[i].front = NULL;Q[i].rear = NULL; } p = ph->next;if(p){ph->next = p->next;p->next = NULL;}//第一个记录被单独拆到p里面while(p){idx = p->data;for(i = 0; i < d; i++)idx = idx / N;//第一趟排序,d = 0idx = idx % N;//根据关键字分配到Q中if(Q[idx].front = NULL){Q[idx].front = p;Q[idx].rear = p;} else{//尾插法 Q[idx].rear->next = p;Q[idx].rear = p;}p = ph->next;if(p){//拆,直到拆完 ph->next = p->next;p->next = NULL;}} 
}void collect(TNode *ph, TPointer *Q){TNode *p;int i;//ph为头结点,最终可以传出去for(i = 0; !Q[i].front; i++);//找出第一个队列中非空结点ph->next = Q[i].front;p = Q[i].rear;i++;for(; i < N; i++){if(Q[i].front){p->next = Q[i].front;p = Q[i].rear;//注意的是Q[i]内部的结点是连接好的 }}p->next = NULL;
} void list_sort(int *R, int n){int i;TNode *ph, *p;TPointer Q[N];int m = max(R, n);ph = create_list(R, n);for(i = 0; m; i++, m /= N){dispatch(ph, Q, i);collect(ph, Q);}for(i = 0, p = ph->next; p; p = p->next){R[i] = p->data;}free(ph);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Magicodes.IE基础教程之导出Pdf

说明本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出要点导出PDF数据自定义PDF模板导出单据如何批量导出单据导出特性说明PdfExporterAttributePdfExporterAttribute特性用于设置Pdf导出的总体设置&#xff0c;比如方向、纸张等。主要包含如下设置&#xff1a;Name:文档…

mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层如何执行吗?

作者&#xff1a;不才陈某前言在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求&#xff0c;但是你真的理解order by在 Mysql 底层是如何执行的吗&#xff1f;假设你要查询城市是苏州的所有人名字&#xff0c;并且按照姓名进行排序返回前 1000 个人的姓名、年龄…

排序-总结

排序 排序:重点在于对于记录的关键字进行排序,得到按关键字有序记录序列 分为: A.内部排序: 排序过程在内存中进行 B.外部排序: 待排序记录数据量过大,需要借助外部存储设备 排序的稳定性:排序后有相同关键字的记录顺序不变就是稳定的排序 插入类排序: 1.直接插入排…

.NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记

10 | 环境变量配置提供程序&#xff1a;容器环境下配置注入的最佳途径环境变量的配置提供程序主要适应场景&#xff1a;1、在 Docker 中运行时2、在 Kubernetes 中运行时3、需要设置 ASP.NET Core 的一些内置特殊配置时环境变量和命令行这两个提供程序在早期是没有容器化的&…

python和qt哪个好_做个小的桌面用node还是QT比较好? - Web开发 - WebDev - 水木社区...

楼主说了自己水平不高&#xff0c;那就专注 py 一门语言就好了。electron 这边虽然现在已经简单了很多&#xff0c;但也是两个进程起步&#xff0c;main 和 renderer 进程的 api 又不一样&#xff0c;renderer 只有 node api 的子集。你大概觉得不挺简单的么&#xff0c;但对于…

堆元素插入 二叉堆一般用数组来表示。typedef struct _otherInfo{ int i; int j;}OtherInfo;-icoding-C-数据结构

堆元素插入 二叉堆一般用数组来表示。例如&#xff0c;根节点在数组中的位置是0&#xff0c;第n个位置的子节点分别在2n1和 2n2。 因此&#xff0c;第0个位置的子节点在1和2&#xff0c;1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。 在二叉堆上可以进行插…

dotnetcore3.1 WPF 实现多语言

dotnetcore3.1 WPF 实现多语言Intro最近把 DbTool 从 WinForm 迁移到了 WPF&#xff0c;并更新到了 dotnet core 3.1&#xff0c;并实现了基于 Microsoft.Extensions.Localization 实现了基本的多语言支持。下面来分享一下如何来实现服务注册如果不熟悉如何在 WPF 中使用依赖注…

卸载chrome_Chrome 浏览器必备“扩展管理工具”,一键管理 Chrome 扩展

前言丰富的扩展插件可以说是 Chrome 浏览器的灵魂了&#xff0c;但是扩展安装的多了&#xff0c;难免会引起卡顿&#xff0c;而且每次打开/关闭扩展都要进入扩展程序页面&#xff0c;切换起来很不方便。下面分享的三款 Chrome 扩展管理工具&#xff0c;可以让我们更便捷地管理 …

堆化 二叉堆一般用数组来表示。typedef struct _minHeapNodetypedef struct _otherInfo-icoding-C-数据结构

堆化 二叉堆一般用数组来表示。例如&#xff0c;根节点在数组中的位置是0&#xff0c;第n个位置的子节点分别在2n1和 2n2。 因此&#xff0c;第0个位置的子节点在1和2&#xff0c;1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。 在二叉堆上可以进行插入节点…

POJ 3984 迷宫问题

定义一个二维数组&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&#xff0c;要…

面试官:你连HTTP请求Post和Get都不了解?

IT界知名的程序员曾说&#xff1a;对于那些月薪三万以下&#xff0c;自称IT工程师的码农们&#xff0c;其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居&#xff0c;但只是他们一厢情愿罢了。此话一出&#xff0c;不知激起了多少(码农)程序员的愤怒…

python升级pip在哪儿打开_Linux下升级python和安装pip的详解

Linux版本升级&#xff1a;1、首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致3、解压tar -zxvf Python-2.7.11.tgz进入Python-2.7.11目录 输入./configuremakemake install4、此时查看python版本还是系统默认的版本执行&#xff1a;mv /usr/bin/python …

[蓝桥杯2017决赛]图书排列-next_permutation枚举

题目描述 将编号为1~10的10本书排放在书架上&#xff0c;要求编号相邻的书不能放在相邻的位置。 请计算一共有多少种不同的排列方案。 输出 输出一个整数表示答案 代码如下: #include <iostream> #include <algorithm> using namespace std;int a[] {1, 2, 3, 4…

第一个一千行总结-数据结构C复习--知识点总结1--一到四章

总结 第一章: 数据结构包括:逻辑结构,储存结构, 运算集合 逻辑结构:分为线性(线性表, 栈, 队列, 字符串, 数组, 广义表) 非线性:树,图,网 储存结构:顺序储存和非顺序储存 线性储存,散列储存,链式储存 算法数据结构 程序 第二章:线性表: 线性表的线性储存 逻辑结构:…

运维进化论:微盟“删库跑路”给我们的启示

作者&#xff1a;茹炳晟&#xff0c;软件质量和研发工程效能专家事件背景微盟是国内移动互联网营销引领者&#xff0c;中国最大的微信公众智能服务平台&#xff0c;基于微信为企业提供开发、运营、培训、推广一体化解决方案&#xff0c;帮助企业实现线上线下互通&#xff0c;社…

[蓝桥杯2016决赛]阶乘位数-数论

题目描述 9的阶乘等于&#xff1a;362880 它的二进制表示为&#xff1a;1011000100110000000 这个数字共有19位。 请你计算&#xff0c;9999 的阶乘的二进制表示一共有多少位&#xff1f; 输出 输出一个整数表示答案 知识点: 整数m在k进制下&#xff0c;有多少位&#xff1f; …

拦截器如何获取@requestbody_分布式系统中如何优雅地追踪日志(原理篇)

分布式系统中日志追踪需要考虑的几个点&#xff1f;需要一个全服务唯一的id&#xff0c;即traceId&#xff0c;如何保证&#xff1f;traceId如何在服务间传递&#xff1f;traceId如何在服务内部传递&#xff1f;traceId如何在多线程中传递&#xff1f;我们一一来解答&#xff1…

数组合并假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法,将这 n 个数组合并到一个数组,且各元素按升序排列。即实现函数-C-icoding-排序-数据结构

数组合并 假设有 n 个长度为 k 的已排好序&#xff08;升序&#xff09;的数组&#xff0c;请设计数据结构和算法&#xff0c; 将这 n 个数组合并到一个数组&#xff0c;且各元素按升序排列。即实现函数&#xff1a; void merge_arrays(const int* arr, int n, int k, int* out…