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

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

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

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

定义:

//待排序记录结点
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相关推荐

  1. 排序-选择类排序--堆排序简介

    参考:数据结构(严蔚敏) 选择类排序有两个经典算法,一个是之前总结过的直接选择排序,另一个则是今天要讲的堆排序 0.什么是堆 对于Java中的一个数组Array,如果对于其中所有的元素其下标index ...

  2. 排序-交换类排序--快速排序简介

    交换类排序有冒泡和快排 冒泡排序相对简单,之前总结过: https://blog.csdn.net/u011109881/article/details/80038573 快速排序 参考: 数据结构( ...

  3. 数据结构-第九章 内部排序-知识点总结1

    第九章 内部排序 排序:重点在于对于记录的关键字进行排序,得到按关键字有序记录序列 分为:     A.内部排序: 排序过程在内存中进行      B.外部排序: 待排序记录数据量过大,需要借助外部存 ...

  4. 排序算法之交换类排序

    交换类排序 交换类排序的思想,顾名思义,就是在每一轮的排序过程,通过不断的交换来使每个元素到达最终的位置.常见的两种交换类排序有冒泡排序和快速排序. 冒泡排序(Bubble sort) 冒泡排序作为最 ...

  5. 《数据结构》-第八章 排序(知识点总结)

    第八章 排序 排序作为各类数据结构的相应的运算的一种,在很多领域中都有广泛的应用.主要的排序方法有插入排序.交换排序.选择排序.二路归并排序.基数排序.外部排序等各类排序方法.堆排序.快速排序和归并排 ...

  6. 数据结构-第九章 内部排序-知识点总结2

    选择类排序: 1.简单选择排序: 直接从数组中选择最小的记录和第一个记录交换位置,循环. 示例代码如下: void SelectSort(int r[], int b){int i, j, k;int ...

  7. 排序(Sort)知识点归纳

    目录 1.基本概念 两种基本操作: 三种待排序存储方式 2.插入排序 直接插入排序 1.时间复杂度 2.空间复杂度 3.算法稳定性 希尔排序 注意: 3.交换排序 冒泡排序(Bubble Sort) ...

  8. 数据结构几类排序的总结和完整代码 待续。。

    一 插入排序 简单插入排序 希尔排序 二 快速排序 快排是冒泡排序的改进,每做一次排序可以确定一个数最终的位置p,同时把所有小于这个数的放在它左边,小于这个数的放在它后面.再递归地进行p左边部分和p右 ...

  9. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

最新文章

  1. Python模块学习——optparse
  2. 微软资深软件工程师:阅读代码真的很难
  3. 十分钟读懂『卡尔曼滤波算法』
  4. 进军人工智能,数学基础很重要?
  5. 睡眠音频分割及识别问题(八)--数据采集
  6. 说一下安卓的touch事件分发机制
  7. 对php的感受100字_【php实训心得】php心得体会
  8. 19n20c的参数_FQB19N20CTM
  9. php数组中去掉空格,php数组如何去除空格
  10. Windows内存体系(4) -- 内存映射文件
  11. PHP代码审计入门学习过程
  12. java中特殊符号_java中的特殊字符集合
  13. 单节点Elasticsearch健康状态为 yellow
  14. php 获取月初月末时间,php一个获取下月月初和月末的函数
  15. matlab lte rsrp,LTE 下行速率和SINR、RSRP什么关系?
  16. linux进程管理原理
  17. 课余或者业余学习python,可以嘛?
  18. 使用python(matplotlib)打开图片
  19. 2021年山东大学程序设计精英挑战赛 真题
  20. 裸面 裸考霸面 霸考

热门文章

  1. 汇编语言之寄存器(内存访问)
  2. 【C语言简单说】八:分支结构之if...else...(2)
  3. python画两条曲线_查找在matplotlib中绘制的两条曲线之间的区域(在区域之间填充)...
  4. 实验 4 操作、输出值和数据表实验报告--软件功能测试与性能测试实验
  5. 如何隐晦地表达“滚”?
  6. 我看你还能坚持多久?!
  7. 理科生浪漫起来,谁都顶不住!
  8. 中小学将逐步推广编程教育;勒索病毒攻击部分政府部门和医院;国内外药企密集调价;微软要给Win7用户推死亡通知,这就是今天的大新闻...
  9. 春节特惠活动┃给孩子讲100个科学道理,不如带他做这些趣味实验!
  10. 如何简单形象又有趣地讲解神经网络是什么?