各种排序算法大全

上传人:san****019 文档编号:20988250 上传时间:2021-04-21 格式:PPT 页数:35 大小:1.18MB
返回 下载 相关 举报
各种排序算法大全_第1页
第1页 / 共35页
各种排序算法大全_第2页
第2页 / 共35页
各种排序算法大全_第3页
第3页 / 共35页
点击查看更多>>
资源描述
6.1 常 见 的 排 序 算 法 冒 泡 排 序 快 速 排 序直 接 插 入 排 序 希 尔 排 序 选 择 排 序 堆 排 序归 并 排 序 6.1.1 冒 泡 排 序算 法 描 述设 待 排 序 记 录 序 列 中 的 记 录 个 数 为 n一 般 地 , 第 i趟 起 泡 排 序 从 1到 n-i+1依 次 比 较 相 邻 两 个 记 录 的 关 键 字 , 如 果 发 生 逆 序 , 则 交 换 之其 结 果 是 这 n-i+1个 记 录 中 , 关 键 字 最 大 的 记 录 被 交 换 到 第 n-i+1的 位置 上 , 最 多 作 n-1趟 。 6.1.1 冒 泡 排 序算 法 实 例0 1 2 3 4 5 6.1.1 冒 泡 排 序算 法 实 例0 1 2 3 4 5 6.1.1 冒 泡 排 序算 法 实 例 初始关键字第一趟排序第四趟排序第二趟排序第三趟排序第五趟排序 6.1.1 冒 泡 排 序算 法 实 现输入n 个数给a1 到 anfor j=1 to n-1for i=1 to n-jaiai+1真假aiai+1输出a1 到 an #include main() int a11,i,j,t; printf(Input 10 numbers:n); for(i=1;i11;i+) scanf(%d, printf(n); for(j=1;j=9;j+) for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf(The sorted numbers:n); for(i=1;i11;i+)printf(%d ,ai); 6.1.2 快 速 排 序 算 法 特 点 :快 速 排 序 是 通 过 比 较 关 键 码 、 交 换 记 录 ,以 某 个 记 录 为 界 (该 记 录 称 为 支 点 ), 将 待 排 序 列 分 成 两 部 分一 部 分 所 有 记 录 的 关 键 码 大 于 等 于 支 点 记 录 的 关 键 码另 一 部 分 所 有 记 录 的 关 键 码 小 于 支 点 记 录 的 关 键 码 6.1.2 快 速 排 序 算 法 描 述 :任 取 待 排 序 记 录 序 列 中 的 某 个 记 录 (例 如 取 第 一 个 记 录 )作 为 基 准 (枢 ),按 照 该 记 录 的关 键 字 大 小 ,将 整 个 记 录 序 列 划 分 为 左 右 两 个 子 序 列左 侧 子 序 列 中 所 有 记 录 的 关 键 字 都 小 于 或 等 于 基 准 记 录 的 关 键 字 右 侧 子 序 列 中 所 有 记 录 的 关 键 字 都 大 于 基 准 记 录 的 关 键 字基 准 记 录 则 排 在 这 两 个 子 序 列 中 间 (这 也 是 该 记 录 最 终 应 安 放 的 位 置 )。然 后 分 别 对 这 两 个 子 序 列 重 复 施 行 上 述 方 法 , 直 到 所 有 的 记 录 都 排 在 相 应 位 置 上 为止 。基 准 记 录 也 称 为 枢 轴 ( 或 支 点 ) 记 录 。取 序 列 第 一 个 记 录 为 枢 轴 记 录 , 其 关 键 字 为 Pivotkey 指 针 low指 向 序 列 第 一 个 记 录 位 置指 针 high指 向 序 列 最 后 一 个 记 录 位 置 6.1.2 快 速 排 序 算 法 实 例 :始关键字pivotkey一次交换二次交换三次交换 high-1完成一趟排序low highlowlow lowlowlow highhighhighhighhigh 6.1.2 快 速 排 序 算 法 实 例 : 10 完成一趟排序分别进行快速排序有序序列 6.1.2 快 速 排 序 算 法 分 析 :快 速 排 序 是 一 个 递 归 过 程 ;利 用 序 列 第 一 个 记 录 作 为 基 准 , 将 整 个 序 列 划 分 为 左 右 两 个 子 序 列 。 只 要是 关 键 字 小 于 基 准 记 录 关 键 字 的 记 录 都 移 到 序 列 左 侧 ;快 速 排 序 的 趟 数 取 决 于 递 归 树 的 高 度 。如 果 每 次 划 分 对 一 个 记 录 定 位 后 , 该 记 录 的 左 侧 子 序 列 与 右 侧 子 序 列 的 长 度 相 同 , 则 下 一 步 将 是 对 两 个 长 度 减 半 的 子 序 列 进 行 排 序 , 这 是 最 理 想 的 情况 11 6.1.3 直 接 插 入 排 序 算 法 描 述 :记 录 存 放 在 数 组 R0.n-1中 , 排 序 过 程 的 某 一 中 间 时 刻 , R被 划 分成 两 个 子 区 间 R0i-1和 Ri.n-1, 其 中 : 前 一 个 子 区 间 是 已 排 好序 的 有 序 区 ; 后 一 个 子 区 间 则 是 当 前 未 排 序 的 部 分 。基 本 操 作将 当 前 无 序 区 的 第 1个 记 录 Ri插 入 到 有 序 区 R0.i-1中 适 当 的 位 置, 使 R0i变 为 新 的 有 序 区 6.1.3 直 接 插 入 排 序 操 作 细 节 :当 插 入 第 i(i 1)个 对 象 时 , 前 面 的 r0, r1, , ri-1已 经 排好 序 。用 ri的 关 键 字 与 ri-1, ri-2, 的 关 键 字 顺 序 进 行 比 较 (和 顺序 查 找 类 似 ), 如 果 小 于 , 则 将 rx向 后 移 动 (插 入 位 置 后 的 记 录 向后 顺 移 )找 到 插 入 位 置 即 将 ri插 入 6.1.3 直 接 插 入 排 序 实 用 例 子 :已 知 待 序 的 一 组 记 录 的 初 始 排 列 为 : 21, 25, 49, 25*, 16, 080 1 2 3 4 5 6.1.3 直 接 插 入 排 序 实 用 例 子 : 0 1 2 3 4 5 tem p250 1 2 3 4 5 tem p 49 25* 0 1 2 3 4 5 6.1.3 直 接 插 入 排 序 实 用 例 子 :0 1 2 3 4 5 tem p160 1 2 3 4 5 tem p080 1 2 3 4 5完 成 6.1.3 直 接 插 入 排 序 算 法 实 现 :void InsertSort (int r , int n ) / 假设关键字为整型,放在向量r中 int i, j, temp; for (i = 1;i0;j- -) /从后向前顺序比较,并依次后移 if ( temp rj-1 ) rj = rj-1; else break; rj = temp; 6.1.3 直 接 插 入 排 序 算 法 分 析 :关 键 字 比 较 次 数 和 记 录 移 动 次 数 与 记 录 关 键 字 的 初 始 排 列 有 关 。最 好 情 况 下 , 排 序 前 记 录 已 按 关 键 字 从 小 到 大 有 序 , 每 趟 只 需 与 前 面 有 序记 录 序 列 的 最 后 一 个 记 录 比 较 1次 , 移 动 2次 记 录 , 总 的 关 键 字 比 较 次 数为 n-1, 记 录 移 动 次 数 为 2(n-1)在 平 均 情 况 下 的 关 键 字 比 较 次 数 和 记 录移 动 次 数 约 为 n2/4。直 接 插 入 排 序 是 一 种 稳 定 的 排 序 方 法直 接 插 入 排 序 最 大 的 优 点 是 简 单 , 在 记 录 数 较 少 时 , 是 比 较 好 的 办 法 6.1.4 希 尔 排 序 希 尔 排 序 又 称 缩 小 增 量 排 序是 1959年 由 D.L.Shell提 出 来 的 算 法 描 述先 取 定 一 个 小 于 n的 整 数 d作 为 第 一 个 增 量 , 把 表 的 全 部 记 录 分 成 d组所 有 距 离 为 d1的 倍 数 的 记 录 放 在 同 一 组 中 , 在 各 组 内 进 行 直 接 插 入排 序然 后 取 第 二 个 增 量 d2d1重 复 上 述 的 分 组 和 排 序 , 直 至 增 量 d 1, 即 所 有 记 录 放 在 同 一 组 中进 行 直 接 插 入 排 序 为 止 。 6.1.4 希 尔 排 序 算 法 特 点先 取 定 一 个 小 于 n的 整 数 d作 为 第 一 个 增 量 , 把 表 的 全 部 记 录 分 成 d组所 有 距 离 为 d1的 倍 数 的 记 录 放 在 同 一 组 中 , 在 各 组 内 进 行 直 接 插 入排 序然 后 取 第 二 个 增 量 d2d1重 复 上 述 的 分 组 和 排 序 , 直 至 增 量 d 1, 即 所 有 记 录 放 在 同 一 组 中进 行 直 接 插 入 排 序 为 止 。 6.1.4 希 尔 排 序 运 用 实 例先 取 定 一 个 小 于 n的 整 数 d作 为 第 一 个 增 量 , 把 表 的 全 部 记 录 分 成 d组所 有 距 离 为 d1的 倍 数 的 记 录 放 在 同 一 组 中 , 在 各 组 内 进 行 直 接 插 入排 序然 后 取 第 二 个 增 量 d2d1重 复 上 述 的 分 组 和 排 序 , 直 至 增 量 d 1, 即 所 有 记 录 放 在 同 一 组 中进 行 直 接 插 入 排 序 为 止 。 6.1.4 希 尔 排 序 希 尔 排 序 又 称 缩 小 增 量 排 序是 1959年 由 D.L.Shell提 出 来 的 算 法 描 述首 先 取 一 个 整 数 gap n(待 排 序 记 录 数 ) 作 为 间 隔 , 将 全 部 记 录 分 为 gap 个 子 序 列 , 所 有 距 离 为 gap 的 记 录 放 在 同 一 个 子 序 列 中在 每 一 个 子 序 列 中 分 别 施 行 直 接 插 入 排 序 。 然 后 缩 小 间 隔 gap, 例 如 取 gap = gap/2重 复 上 述 的 子 序 列 划 分 和 排 序 工 作 , 直 到 最 后 取 gap = 1, 将 所 有 记 录 放 在 同一 个 序 列 中 排 序 为 止 。 6.1.4 希 尔 排 序 运 用 实 例已 知 待 排 序 的 一 组 记 录 的 初 始 排 列 为 : 21, 25, 49, 25*, 16, 080 1 2 3 4 5 6.1.4 希 尔 排 序 运 用 实 例t 3 0 1 2 3 4 50 1 2 3 4 5t 2t 1 6.1.4 希 尔 排 序 算 法 分 析开 始 时 gap 的 值 较 大 , 子 序 列 中 的 记 录 较 少 , 排 序 速 度 较 快随 着 排 序 进 展 , gap 值 逐 渐 变 小 , 子 序 列 中 记 录 个 数 逐 渐 变 多 ,由 于前 面 大 多 数 记 录 已 基 本 有 序 , 所 以 排 序 速 度 仍 然 很 快Gap的 取 法 有 多 种 。 shell 提 出 取 gap = n/2, gap = gap/2,直 到 gap = 1。 6.1.5 选 择 排 序 排 序 过 程 :首 先 通 过 n-1次 比 较 , 从 n个 数 中 找 出 最 小 的 , 将 它 与 第 一 个 数 交 换第 一 趟 选 择 排 序 , 结 果 最 小 的 数 被 安 置 在 第 一 个 元 素 位置 上再 通 过 n-2次 比 较 , 从 剩 余 的 n-1个 数 中 找 出 关 键 字 次 小 的 记 录 ,将 它 与 第 二 个 数 交 换第 二 趟 选 择 排 序重 复 上 述 过 程 , 共 经 过 n-1趟 排 序 后 , 排 序 结 束 6.1.5 选 择 排 序 排 序 实 例 :例初始: 49 38 65 97 76 13 27 k ji=1 13 49一趟: 13 38 65 97 76 49 27 i=2 27 38二趟: 13 27 65 97 76 49 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 49 65 76 97 k kkk j j j j jj j j j j 6.1.5 选 择 排 序 算 法 实 例 : 0 1 2 3 4 5 6.1.5 选 择 排 序 算 法 实 例 :0 1 2 3 4 5 最 小 者最 小 者各趟排序后的结果 6.1.5 选 择 排 序 算 法 实 例 :0 1 2 3 4 5i =2时选择排序的过程i k j i k j i k j 6.1.5 选 择 排 序 算 法 实 例 :0 1 2 3 4 5i k j 6.1.5 选 择 排 序 算 法 实 现 :输入n 个数给a1 到 anfor i=1 to n-1for j=i+1 to najak真假k=j 输出a1 到 ank=iaiak i != k真假 #include main() int a11,i,j,k,x; printf(Input 10 numbers:n); for(i=1;i11;i+) scanf(%d, printf(n); for(i=1;i10;i+) k=i; for(j=i+1;j=10;j+) if(ajak) k=j; if(i!=k) x=ai; ai=ak; ak=x; printf(The sorted numbers:n); for(i=1;i11;i+) printf(%d ,ai); 阶 段 小 节几 种 常 见 的 排 序 算 法冒 泡 排 序 的 特 点快 速 排 序 的 特 点 , 一 趟 排 序 的 子 过 程 本 章 总 结数 据 结 构 与 算 法 初 步 常 见 的 排 序 算 法 重点讲述冒泡排序和快速排序的特,同时大概了解直接插入排序,希尔排序和选择排序的基本思路 实 验 1题 目 题 目 : 实 现 对 数 组 265, 301, 751, 129, 937, 863, 742, 694, 076, 438进 行 排 序 , 用 快 速 排 序 方 法 来 实 现 。 并 列 出 每 趟 排 序 的 结 果实 验 目 的考 察 快 速 排 序 算 法 的 基 本 思 路 了 解 快 速 排 序 算 法 的 每 趟 操 作 流 程 实 验 分 析建 立 一 个 数 组 , 并 初 始 化进 行 数 据 的 第 一 趟 快 速 排 序 了 解 快 速 排 序 每 趟 操 作 结 果 , 分 析 排 序 快 速 的 最 快 数 组 类 型 和 最 慢 数 组 类 型
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!