数据结构-排序-分配类排序-知识点总结归纳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);
}
数据结构-排序-分配类排序-知识点总结归纳3相关推荐
- 排序-选择类排序--堆排序简介
参考:数据结构(严蔚敏) 选择类排序有两个经典算法,一个是之前总结过的直接选择排序,另一个则是今天要讲的堆排序 0.什么是堆 对于Java中的一个数组Array,如果对于其中所有的元素其下标index ...
- 排序-交换类排序--快速排序简介
交换类排序有冒泡和快排 冒泡排序相对简单,之前总结过: https://blog.csdn.net/u011109881/article/details/80038573 快速排序 参考: 数据结构( ...
- 数据结构-第九章 内部排序-知识点总结1
第九章 内部排序 排序:重点在于对于记录的关键字进行排序,得到按关键字有序记录序列 分为: A.内部排序: 排序过程在内存中进行 B.外部排序: 待排序记录数据量过大,需要借助外部存 ...
- 排序算法之交换类排序
交换类排序 交换类排序的思想,顾名思义,就是在每一轮的排序过程,通过不断的交换来使每个元素到达最终的位置.常见的两种交换类排序有冒泡排序和快速排序. 冒泡排序(Bubble sort) 冒泡排序作为最 ...
- 《数据结构》-第八章 排序(知识点总结)
第八章 排序 排序作为各类数据结构的相应的运算的一种,在很多领域中都有广泛的应用.主要的排序方法有插入排序.交换排序.选择排序.二路归并排序.基数排序.外部排序等各类排序方法.堆排序.快速排序和归并排 ...
- 数据结构-第九章 内部排序-知识点总结2
选择类排序: 1.简单选择排序: 直接从数组中选择最小的记录和第一个记录交换位置,循环. 示例代码如下: void SelectSort(int r[], int b){int i, j, k;int ...
- 排序(Sort)知识点归纳
目录 1.基本概念 两种基本操作: 三种待排序存储方式 2.插入排序 直接插入排序 1.时间复杂度 2.空间复杂度 3.算法稳定性 希尔排序 注意: 3.交换排序 冒泡排序(Bubble Sort) ...
- 数据结构几类排序的总结和完整代码 待续。。
一 插入排序 简单插入排序 希尔排序 二 快速排序 快排是冒泡排序的改进,每做一次排序可以确定一个数最终的位置p,同时把所有小于这个数的放在它左边,小于这个数的放在它后面.再递归地进行p左边部分和p右 ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
最新文章
- Python模块学习——optparse
- 微软资深软件工程师:阅读代码真的很难
- 十分钟读懂『卡尔曼滤波算法』
- 进军人工智能,数学基础很重要?
- 睡眠音频分割及识别问题(八)--数据采集
- 说一下安卓的touch事件分发机制
- 对php的感受100字_【php实训心得】php心得体会
- 19n20c的参数_FQB19N20CTM
- php数组中去掉空格,php数组如何去除空格
- Windows内存体系(4) -- 内存映射文件
- PHP代码审计入门学习过程
- java中特殊符号_java中的特殊字符集合
- 单节点Elasticsearch健康状态为 yellow
- php 获取月初月末时间,php一个获取下月月初和月末的函数
- matlab lte rsrp,LTE 下行速率和SINR、RSRP什么关系?
- linux进程管理原理
- 课余或者业余学习python,可以嘛?
- 使用python(matplotlib)打开图片
- 2021年山东大学程序设计精英挑战赛 真题
- 裸面 裸考霸面 霸考
热门文章
- 汇编语言之寄存器(内存访问)
- 【C语言简单说】八:分支结构之if...else...(2)
- python画两条曲线_查找在matplotlib中绘制的两条曲线之间的区域(在区域之间填充)...
- 实验 4 操作、输出值和数据表实验报告--软件功能测试与性能测试实验
- 如何隐晦地表达“滚”?
- 我看你还能坚持多久?!
- 理科生浪漫起来,谁都顶不住!
- 中小学将逐步推广编程教育;勒索病毒攻击部分政府部门和医院;国内外药企密集调价;微软要给Win7用户推死亡通知,这就是今天的大新闻...
- 春节特惠活动┃给孩子讲100个科学道理,不如带他做这些趣味实验!
- 如何简单形象又有趣地讲解神经网络是什么?