内排序
内排序
C+V内排序
- 记录:进行排序的基本单位
- 关键码:唯一确定记录的一个或多个域
- 排序码:作为排序运算依据的一个或多个码
- 序列:线性表,由记录组成的集合
- 排序:将序列中的记录按照排序码特定顺序排列起来,即排序码域的值具有不减(或不增)的顺序
简单排序
- 插入排序
- 冒泡排序
- 选择排序
复杂度$O(n^2)$
插入排序
实现
void StraightInsertSorter(Record Array[],int n){ |
优化
引入二分查找
实现:
void BinaryInsertSorter(Record Array[], int n) { |
冒泡
算法稳定
直接选择排序
void StraightSelectSorter(Record Array[], int n) { |
==注意==:不稳定!
shell排序
- shell排序的提出基于直接插入排序的两个性质
- 在待排序序列较短情形下效率高
- 在整体有序的情形下时间代价低
- shell排序又称为“缩小增量排序”
不稳定的排序方法
// Shell 排序实现,delta=2 |
基于分治法的排序
快速排序
|
归并排序
- 简单地将原始序列划分为两个子序列
- 分别对每个子序列递归划分,直到不可划分为止
- 最后将排好序的子序列合并为一个有序序列,即归并过程
template <class Record> |
堆排序
分配排序
桶排序
//统计每个取值出现的次数 |
实现
|
基数排序
这一页介绍了基数排序的基本概念和原理。
主要内容:
排序码由多个部分组成:
- 一个序列 ( R = { r_0, r_1, \ldots, r_{n-1} } ) 中的每个排序码 ( K ) 由 ( d ) 位子排序码组成,可以表示为 ( K = (k_{d-1}, k_{d-2}, \ldots, k_1, k_0) )。
- 其中,( k_{d-1} ) 称为最高位排序码,( k_0 ) 称为最低位排序码。
排序条件:
- 对于任意两个记录 ( R_i ) 和 ( R_j ),若 ( R ) 是有序的,则需要满足:
[
(k_{i,d-1}, k_{i,d-2}, \ldots, k_{i,1}, k_{i,0}) \leq (k_{j,d-1}, k_{j,d-2}, \ldots, k_{j,1}, k_{j,0})
] - 也就是说,需要从最高位到最低位逐位比较子排序码。
- 对于任意两个记录 ( R_i ) 和 ( R_j ),若 ( R ) 是有序的,则需要满足:
基数:
- 每个子排序码 ( K_i ) 的取值范围称为基数,用 ( r ) 表示。
举例:
假设有三个两位数的排序码:45、32 和 23。
- 可以分解为十位和个位两部分,即 ( K = (十位, 个位) )。
- 比如,45 的排序码表示为 ( (4, 5) ),32 表示为 ( (3, 2) ),23 表示为 ( (2, 3) )。
- 如果按照从高位到低位的顺序进行排序,首先比较十位,得到 23 < 32 < 45。
高位优先法
低位优先
基于顺序存储的基数排序
- 数组R长度:n
- 基数:r
- 排序码位数:d
void RadixSorter<Record>::Sort(Record Array[], int n, int d, int r) { |
基于静态链的基数排序
根据提供的图片内容,以下是提取并合并的完整代码:
class Node { // 结点类 |
代码说明
- Node 类和StaticQueue 类:定义了链表结点和静态队列的结构。
- RadixSort 函数:执行基数排序,通过调用
Distribute
和Collect
完成每一位的分配和收集。 - Distribute 函数:将记录分配到不同的队列(桶)中。
- Collect 函数:收集每个队列中的记录,形成有序链。
索引排序
分类
评论
匿名评论隐私政策