各种经典排序算法.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调整为 (14, 23, 36, 49, 52, 58, 61 ,75, 80, 97)
排序
2. 排序的定义
假设含n个记录的序列为{ R1, R2, …, Rn } 其相应的关键字序列为 { K1, K2, …,Kn } 这些关键字相互之间可以进行比较,即在 它们之间存在着这样一个关系 :
Kp1≤Kp2≤…≤Kpn 按此固有关系将上式记录序列重新排列为
排序
本节基本内容与要求
基本内容 顺序查找、二分查找、二叉树查找以及散列表上查 找 及算法思想 排序的基本概念以及选择、插入、交换和归并四类 排序的基本思想和算法
要求 掌握线性表、树和散列表(或称哈希表)的查找方法 及算法实现以及各种查找方法的应用 熟练掌握选择、插入、交换和归并四类排序的基本 思想和算法
例:
待排元素序列:[53] 27 36 15 69 42 第一次排序: [27 53] 36 15 69 42 第二次排序: [27 36 53] 15 69 42 第三次排序: [15 27 36 53] 69 42 第四次排序: [15 27 36 53 69] 42 第五次排序: [15 27 36 42 53 69]
排序
5、排序的分类
内部排序:是指在排序的整个过程中,数据全部存放 在计算机的内存储器里,并且在内存储器里调整数据 的位置;
当文件很大以致内存不足以存放全部数据时,在排序 过程中需要对外存进行存取访问,称这种借助于外存 储器进行排序的方法为外部排序。
注意: ① 内排序适用于记录个数不很多的小文件 ② 外排序则适用于记录个数太多,不能一次将其全 部记录放入内存的大文件。
有序序列L.r[1..i-1] 无序序列 L.r[i..n]
L.r[i]
有序序列L.r[1..i] 无序序列 L.r[i+1..n]
排序
方法:
具然1体后.方从在法第L:2.r个先[1数将..据i第-1起一]中逐个查个数插找据入L看.到r成[这i是]的个一有插个序入有的序位子的置序子,列序中列去,, 相应的L元.r素[1.要.j]移动L。.r[i] < L.r[j+1..i-1]; 2.将L.r[j+1..i-1]中的所有记录均后移 一个位置; 3.将L.r[i] 插入到L.r[j+1]的位置上。
直接插入排序的程序:
#include "stdio.h" #define n 5 int ar[n]; int c,t;
void d_insort(a) int a[n]; { int i,j; for (i=2;i<=n;i++) { t=a[i]; j=i-1; while ((j>0) && (t<a[j])) {a[j+1]=a[j]; j=j-1;} a[j+1]=t; } }
线性插入排序示例
排序
对于有n个数 据元素的待排 序列,插入操 作要进行n-1
次
该算法适合于n 较 小的情况,时间复 杂度为O(n2).
排序
插入算法
方法:Ki与Ki-1,K i-2,…K1依次比较,直到找到应插入 的位置。
void insertSort(RedType L[ ],int n)
{ int i ,j;
1.4 内部排序
一、基本概念 二、插入排序 三、交换排序 四、选择排序 五、归并排序
排序
百度文库 排序
一、基本概念
1. 排序的功能:将一个数据元素(或记录) 的任意序列,重新排成一个按关键字有序 的序列。
例如:下列是一组记录对应的关键字序列 (52, 49, 80, 36, 14, 58, 61, 23, 97, 75)
二、插入排序
排序
每次将一个待排序的记录,按其关键字大小插入到前 面已经排好序的子文件中的适当位置,直到全部记录 插入完成为止。
把新元素(未排序的元素的关键字)逐个插入正在增 长的顺序表中。
寻找插入位置的方法: 线性插入排序 对半插入排序 希尔排序
排序
1、线性插入排序
基本思想:每步将一个待排序的元素按其大小插入到 前面已排序的数据中的适当位置。重复该工作,直至 有序区包含所有元素。
main() { int i;
printf("请输入数据: "); for (i=1;i<=n;i++)
scanf("%d",&ar[i]); d_insort(ar); printf("排序后的序列: "); for (i=1;i<=n;i++)
{ printf("%d |",ar[i]);
排序
4、排序的稳定性
在待排序的文件中,若存在 多个关键字相同的记录,经 过排序后这些具有相同关键 字的记录之间的相对次序保 持不变,该排序方法是稳定 的;
若有:
{R1 ,..., Ri,...,Rj,.....} 且关键字:
Ki=Kj
i<>j
排序后:
若具有相同关键字的记录之 { Ri,Rj,.....} 间的相对次序发生变化,则 则称该排序结果具有稳定性。 称这种排序方法是不稳定的。
for(i=2; i<=n; i++)
{ L[0]=L[i];
// 作为监视哨
for( j=i-1; L[0].key<L[j].key; j )
L[j+1]=L[j];
//记录后移
L[j+1]=L[0];
// 插入
}}
排序
哨兵(监视哨)
哨兵(监视哨)有两个作用 作为临时变量存放R[i](当前要进行比较的关键字) 的副本; 在查找循环中用来监视下标变量j是否越界。 R[0] R[1] R[2] R[3] R[4] R[5] 6 20 6 15 7 3 15 6 20 15 7 3 7 6 15 20 7 3 3 6 7 15 20 3 3 6 7 15 20
{ Rp1, Rp2, …,Rpn } 的操作称作排序。
排序
3、排序的基本操作
排序的概念:就是要整理文件中的记录,使之按关键字 递增(或递减)次序排列起来。
排序过程的组成步骤:首先比较两个关键字的大小; 然 后将记录从一个位置移动到另一个位置。
对记录的关键字大小进行比较 将记录从一个位置移动到另一个位置 当待排序记录的关键字均不相同时,则排序结果是唯一 的,否则排序的结果不一定唯一。
排序
2. 排序的定义
假设含n个记录的序列为{ R1, R2, …, Rn } 其相应的关键字序列为 { K1, K2, …,Kn } 这些关键字相互之间可以进行比较,即在 它们之间存在着这样一个关系 :
Kp1≤Kp2≤…≤Kpn 按此固有关系将上式记录序列重新排列为
排序
本节基本内容与要求
基本内容 顺序查找、二分查找、二叉树查找以及散列表上查 找 及算法思想 排序的基本概念以及选择、插入、交换和归并四类 排序的基本思想和算法
要求 掌握线性表、树和散列表(或称哈希表)的查找方法 及算法实现以及各种查找方法的应用 熟练掌握选择、插入、交换和归并四类排序的基本 思想和算法
例:
待排元素序列:[53] 27 36 15 69 42 第一次排序: [27 53] 36 15 69 42 第二次排序: [27 36 53] 15 69 42 第三次排序: [15 27 36 53] 69 42 第四次排序: [15 27 36 53 69] 42 第五次排序: [15 27 36 42 53 69]
排序
5、排序的分类
内部排序:是指在排序的整个过程中,数据全部存放 在计算机的内存储器里,并且在内存储器里调整数据 的位置;
当文件很大以致内存不足以存放全部数据时,在排序 过程中需要对外存进行存取访问,称这种借助于外存 储器进行排序的方法为外部排序。
注意: ① 内排序适用于记录个数不很多的小文件 ② 外排序则适用于记录个数太多,不能一次将其全 部记录放入内存的大文件。
有序序列L.r[1..i-1] 无序序列 L.r[i..n]
L.r[i]
有序序列L.r[1..i] 无序序列 L.r[i+1..n]
排序
方法:
具然1体后.方从在法第L:2.r个先[1数将..据i第-1起一]中逐个查个数插找据入L看.到r成[这i是]的个一有插个序入有的序位子的置序子,列序中列去,, 相应的L元.r素[1.要.j]移动L。.r[i] < L.r[j+1..i-1]; 2.将L.r[j+1..i-1]中的所有记录均后移 一个位置; 3.将L.r[i] 插入到L.r[j+1]的位置上。
直接插入排序的程序:
#include "stdio.h" #define n 5 int ar[n]; int c,t;
void d_insort(a) int a[n]; { int i,j; for (i=2;i<=n;i++) { t=a[i]; j=i-1; while ((j>0) && (t<a[j])) {a[j+1]=a[j]; j=j-1;} a[j+1]=t; } }
线性插入排序示例
排序
对于有n个数 据元素的待排 序列,插入操 作要进行n-1
次
该算法适合于n 较 小的情况,时间复 杂度为O(n2).
排序
插入算法
方法:Ki与Ki-1,K i-2,…K1依次比较,直到找到应插入 的位置。
void insertSort(RedType L[ ],int n)
{ int i ,j;
1.4 内部排序
一、基本概念 二、插入排序 三、交换排序 四、选择排序 五、归并排序
排序
百度文库 排序
一、基本概念
1. 排序的功能:将一个数据元素(或记录) 的任意序列,重新排成一个按关键字有序 的序列。
例如:下列是一组记录对应的关键字序列 (52, 49, 80, 36, 14, 58, 61, 23, 97, 75)
二、插入排序
排序
每次将一个待排序的记录,按其关键字大小插入到前 面已经排好序的子文件中的适当位置,直到全部记录 插入完成为止。
把新元素(未排序的元素的关键字)逐个插入正在增 长的顺序表中。
寻找插入位置的方法: 线性插入排序 对半插入排序 希尔排序
排序
1、线性插入排序
基本思想:每步将一个待排序的元素按其大小插入到 前面已排序的数据中的适当位置。重复该工作,直至 有序区包含所有元素。
main() { int i;
printf("请输入数据: "); for (i=1;i<=n;i++)
scanf("%d",&ar[i]); d_insort(ar); printf("排序后的序列: "); for (i=1;i<=n;i++)
{ printf("%d |",ar[i]);
排序
4、排序的稳定性
在待排序的文件中,若存在 多个关键字相同的记录,经 过排序后这些具有相同关键 字的记录之间的相对次序保 持不变,该排序方法是稳定 的;
若有:
{R1 ,..., Ri,...,Rj,.....} 且关键字:
Ki=Kj
i<>j
排序后:
若具有相同关键字的记录之 { Ri,Rj,.....} 间的相对次序发生变化,则 则称该排序结果具有稳定性。 称这种排序方法是不稳定的。
for(i=2; i<=n; i++)
{ L[0]=L[i];
// 作为监视哨
for( j=i-1; L[0].key<L[j].key; j )
L[j+1]=L[j];
//记录后移
L[j+1]=L[0];
// 插入
}}
排序
哨兵(监视哨)
哨兵(监视哨)有两个作用 作为临时变量存放R[i](当前要进行比较的关键字) 的副本; 在查找循环中用来监视下标变量j是否越界。 R[0] R[1] R[2] R[3] R[4] R[5] 6 20 6 15 7 3 15 6 20 15 7 3 7 6 15 20 7 3 3 6 7 15 20 3 3 6 7 15 20
{ Rp1, Rp2, …,Rpn } 的操作称作排序。
排序
3、排序的基本操作
排序的概念:就是要整理文件中的记录,使之按关键字 递增(或递减)次序排列起来。
排序过程的组成步骤:首先比较两个关键字的大小; 然 后将记录从一个位置移动到另一个位置。
对记录的关键字大小进行比较 将记录从一个位置移动到另一个位置 当待排序记录的关键字均不相同时,则排序结果是唯一 的,否则排序的结果不一定唯一。