培训课件数组应用技巧与方法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1次,在数组a的n个数据中选出其小者(只标记其所在位置), 若它不在其位置(即其下标不等于1)则与第一个数据进行交换 (只需交换一次),经过本次处理后,总可以使得数组a的第1个数 据为第1小。
第2次,在数组a的后n-1个数据(即出去已经选择的最小者的各数 据)中,经过类似的处理后,可以使得数组a的第2个数据为第2小。
斜列号 0 1 2 3 4 5 6
a00 a01 a02 a03 a04 a05 a06 7
a10 a11 a12 a13 a14 a15 a16
a 20 a 21 a 22 a 23 a 24 a 25 a 26
8 9
a30 a31 a32 a33 a34 a35 a36 10
a 40 a 41 a 42 a 43 a 44 a 45 a 46 11
•培训课件数组应用技巧与方法
•17
找鞍点的问题
首先要理 清楚思路, 再动手编 程序
•i=0;i<3;i++){
max=a[i][0];
for (j=0;j<3;j++){
if (a[i][j]>max){
max=a[i][j];
maxj=j;
/*求出行中最大数*/
(4)若 ST.elem[ mid ].key = key,说明查找成功,元素序号 =mid; 结束条件:(1)查找成功 : ST.elem[mid].key = key
(2)查找不成功 : high≤low (意即区间长度小于0)
•培训课件数组应用技巧与方法
•12
有序插入
首先查找要插入的位置,假设位置为a[L]之前 则:
if (flag2==0)
printf("\n矩阵中无鞍点!\n");
•培训课件数组应用技巧与方法
•19
}
折半查找的问题
h = 0;
r = 14;
m = (h + r)/2;
while(h<=r&&x!=a[m]) {
if (x < a[m]) {
r = m-1;
m = (h+r)/2;
} else {
•5
直接插入排序
最简单的排序法!
新元素插入到哪里? 在已形成的有序表中线性查找,并在 适当位置插入,把原来位置上的元素向后顺移。
例1:关键字序列T=(13,6,3,31,9,27,5,11),
请写出直接插入排序的中间过程序列。
【13】, 6, 3, 31, 9, 27, 5, 11
【6, 13】, 3, 31, 9, 27, 5, 11
•16
改进程序
int i,j,minj,t; for (i = 0;i < N-1;i++) { minj = i; //有什么作用? for (j = i + 1;j < N;j++) if (a[j] < a[minj]) minj = j; if (minj != i) { t = a[i]; a[i] = a[minj]; a[minj] = t; } }
附加:计数器、累加器、累乘器
计数器
累乘器
int count; while(…){
int s;
…
for(…) {
count ++ }
…
累加器
a=…;
int s; for(…) { …
s=s*a; }
a=…;
s=s+a;
}
•培训课件数组应用技巧与方法
•1
关于一维数组的问题
一般一维数组所涉及的主要问题有
按照排好序的顺序进行查找,比如对 一个升序排列的数组中,找到第一个 大于需要查找的数
折半查找(二分查找)
•培训课件数组应用技巧与方法
•10
折半查找
先给数据排序(例如按升序排好),形成
有序表,然后再将key与正中元素相比, 若key小,则缩小至右半部内查找;再 取其中值比较,每次缩小1/2的范围, 直到查找成功或失败为止。
for (i =n+1;i > L;i--) a[i]=a[i-1]
•培训课件数组应用技巧与方法
•13
有序删除
比如要删除a[d]这个元素,
则 for (j = d;j < n;j++)
a[j]=a[j+1]
•培训课件数组应用技巧与方法
•14
关于选择排序
算法:N元数组a[0]~a[N-1]由小到大排序: 第0步:找到a[0]~a[N-1]中的最小值元素与a[0]交换; 第1步:找到a[1]~a[N-1]中的最小值元素与a[1]交换; 第2步:找到a[2]~a[N-1]中的最小值元素与a[2]交换; … 第i步:找到a[i]~a[N-1]中的最小值元素与a[i]交换; … 第N-2步:找到a[N-2]~a[N-1]中的最小值元素与a[N-2]交换。 算法停止。
a50 a51 a52 a53 a54 a55 a56 12
a60 a61 a62 a63 a64 a65 a66
或自左下向右上两种方式进行,
元素可以表示为a[i-j][ j]或者
已知如下11个元素的有序表: (05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21
和85的数据元素。
Low指向待查元 mid指向待查元素所在
high指向待查元素所
素所在区间的下 界
区间的中间•培位训课置件数组应用技巧与方法 在区间的上界
•11
折半查找
① 先设定3个辅助标志: low,high,mid, 显然有:mid= (low+high)/2 ② 运算步骤:
•培训课件数组应用技巧与方法
•15
程序一
int i,j,minj,t; for (i = 0;i < N-1;i++) { for (j = i + 1;j < N-1;j++) if (a[j] < a[i]) { t = a[i]; a[i] = a[j]; a[j] = t; } }
•培训课件数组应用技巧与方法
交换排序
冒泡排序
快速排序(不稳定)
选择排序
归并排序
基数排序
•培训课件数组应用技巧与方法
•4
插入排序
插入排序的基本思想是: 每步将一个待排序的对象,按其关键码大小,插入 到前面已经排好序的一组对象的适当位置上,直到 对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的。
•培训课件数组应用技巧与方法
【3, 6, 13】, 31, 9, 27, 5, 11
【3, 6, 13,31】, 9, 27, 5, 11
【3, 6, 9, 13,31】, 27, 5, 11
【3, 6, 9, 13,27, 31】, 5, 11
【3, 5, 6, 9, 13,27, 31】, 11
【3, 5, 6, 9, 11,13,27, 31】
for(i=0;i<N/2;i++)
{
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("\n sorted array:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
}
•培训课件数组应用技巧与方法
•22
关于二维数组的问题(双下标的应 用)
涉及到矩阵的问题,一般使用二维 数组加以解决
下面举几个稍微复杂一点的例子, 也是某些考试(比如高级程序员) 经常考到的难题
蛇行矩阵问题
魔方阵问题
矩阵旋转问题
•培训课件数组应用技巧与方法
•23
蛇行方阵问题
输入:N=4 输出:1 3 4 10
2 5 9 11 6 8 12 15 7 13 14 16
优点:每趟结束时,不仅能挤出一个最大值到最后面位置, 还能同时部分理顺其他元素;一旦下趟没有交换发 生,还可以提前结束排序。
前提:顺序存储结构
例:关键字序列 T=(21,25,49,25*,16,08),请写出 冒泡排序的具体实现过程。
初态: 21,25,49, 25*,16, 08
第1趟 21,25,25*,16, 08 , 49
•培训课件数组应用技巧与方法
•24
蛇行矩阵
将自然数1,2,…,N*N,逐个顺
序插入方阵中适当的位置,这
个过程沿斜列进行。将斜列编
号为0,1,2,…,2n(以i表 记,n=N-1),从图中看出在 一斜列上各元素的下标是相等 的,且等于斜列号i。同时方阵 又可分为上三角与下三角(含
对角线)每一斜列上元素个数 为i+1个;下三角每一斜列上 元素个数为2n-i+1个。在斜列 上安排数可以使自右上向左下
(1) low =1,high =11 ,mid =6 ,待查范围是 [1,11]; (2) 若 ST.elem[mid].key < key,说明 key[ mid+1,high] ,
则令:low =mid+1;重算 mid= (low+high)/2;.
(3) 若 ST.elem[mid].key > key,说明key[low ,mid-1], 则令:high =mid–1;重算 mid ;
第2趟 21,25, 16, 08 ,25*,49
第3趟 21,16, 08 ,25, 25*,49
第4趟 16,08 ,21, 25, 25*,49 第5趟 08,16, 21, 25, 25*,49
•培训课件数组应用技巧与方法
•8
选择排序
算法:首先找到数据清单中的最小的数据,然后将这个数据同第一 个数据交换位置;接下来找第二小的数据,再将其同第二个数据交 换位置,以此类推。
•培训课件数组应用技巧与方法
•6
交换排序
交换排序的基本思想是:两两比较待排序记录的关键 码,如果发生逆序(即排列顺序与排序后的次序正好 相反),则交换之,直到所有记录都排好序为止。
交换排序的主要算法有: 1) 冒泡排序 2) 快速排序
•培训课件数组应用技巧与方法
•7
冒泡排序
基本思路:每趟不断将记录两两比较,并按“前小后大” (或“前大后小”)规则交换。
第i次,在数组a后的n-i+1个数据中,经过类似选择处理后,数组a 的第i个数据为第i小。
第n-1次,在数组后的2个数据中,经过类似处理后,总可以使数组 a的第n-1个数据为第n-1小。而这时候第n个数据是第n小。
•培训课件数组应用技巧与方法
•9
查找算法
查找之前要求排序,不然无章可查
顺序查找
• 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16
N=7 1 3 4 10 11 21 22 2 5 9 12 20 23 34 6 8 13 19 24 33 35 7 14 18 25 32 36 43 15 17 26 31 37 42 44 16 27 30 38 41 45 48 28 29 39 40 46 47 49
排序
插入
删除
查找
分类统计
涉及到一些算法,我们通过例题介绍一部分
具体问题的解题算法的思路要靠自己慢慢去体 会
•培训课件数组应用技巧与方法
•2
1. 什么是排序? 将一组杂乱无章的数据按一定的规律顺次排列起来。
存放在数据表中
按关键字排序
2. 排序的目的是什么? ——便于查找!
3.排序算法的好坏如何衡量?
}
}
for(k=0,flag1=1;k<3 && flag1;k++){
if (max>a[k][j])
flag1=0;
/*算出该数是否为列中最小*/
}
if (flag1==1){
printf("\n第%d行,第%d列的%d是鞍点\n",i,maxj,max);
flag2=1;
/*打印鞍点*/
}
即下标i要与下标n-i-1交换
•培训课件数组应用技巧与方法
•21
将一个数组逆序转换程序
#define N 5
main()
{ int a[N]={9,6,5,4,1},i,temp;
printf("\n original array:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
• 时间效率——排序速度(即排序所花费的全部比较次数) • 空间效率——占内存辅助空间的大小 • 稳定性——若两个记录A和B的关键字值相等,但排序后A、
B的先后次序保持不变,则称这种排序算法是稳定的。
•培训课件数组应用技巧与方法
•3
排序算法
插入排序
直接插入排序
折半插入排序
表插入排序
希尔排序
h = m+1;
m = (h+r)/2;
}
}
if (h > r)
printf("无此数");
else
printf("%d",m);
•培训课件数组应用技巧与方法
•20
将一个数组逆序转换
例如1,2,3,4,5,变为5,4,3,2,1
算法分析:用第一个与最后一个交换。
这是a[i],则前面已有i个元素,与它交换的元素a[k]应该满 足与a[k]后面也有i个元素,则这个元素的下 标k为:n-1i
第2次,在数组a的后n-1个数据(即出去已经选择的最小者的各数 据)中,经过类似的处理后,可以使得数组a的第2个数据为第2小。
斜列号 0 1 2 3 4 5 6
a00 a01 a02 a03 a04 a05 a06 7
a10 a11 a12 a13 a14 a15 a16
a 20 a 21 a 22 a 23 a 24 a 25 a 26
8 9
a30 a31 a32 a33 a34 a35 a36 10
a 40 a 41 a 42 a 43 a 44 a 45 a 46 11
•培训课件数组应用技巧与方法
•17
找鞍点的问题
首先要理 清楚思路, 再动手编 程序
•i=0;i<3;i++){
max=a[i][0];
for (j=0;j<3;j++){
if (a[i][j]>max){
max=a[i][j];
maxj=j;
/*求出行中最大数*/
(4)若 ST.elem[ mid ].key = key,说明查找成功,元素序号 =mid; 结束条件:(1)查找成功 : ST.elem[mid].key = key
(2)查找不成功 : high≤low (意即区间长度小于0)
•培训课件数组应用技巧与方法
•12
有序插入
首先查找要插入的位置,假设位置为a[L]之前 则:
if (flag2==0)
printf("\n矩阵中无鞍点!\n");
•培训课件数组应用技巧与方法
•19
}
折半查找的问题
h = 0;
r = 14;
m = (h + r)/2;
while(h<=r&&x!=a[m]) {
if (x < a[m]) {
r = m-1;
m = (h+r)/2;
} else {
•5
直接插入排序
最简单的排序法!
新元素插入到哪里? 在已形成的有序表中线性查找,并在 适当位置插入,把原来位置上的元素向后顺移。
例1:关键字序列T=(13,6,3,31,9,27,5,11),
请写出直接插入排序的中间过程序列。
【13】, 6, 3, 31, 9, 27, 5, 11
【6, 13】, 3, 31, 9, 27, 5, 11
•16
改进程序
int i,j,minj,t; for (i = 0;i < N-1;i++) { minj = i; //有什么作用? for (j = i + 1;j < N;j++) if (a[j] < a[minj]) minj = j; if (minj != i) { t = a[i]; a[i] = a[minj]; a[minj] = t; } }
附加:计数器、累加器、累乘器
计数器
累乘器
int count; while(…){
int s;
…
for(…) {
count ++ }
…
累加器
a=…;
int s; for(…) { …
s=s*a; }
a=…;
s=s+a;
}
•培训课件数组应用技巧与方法
•1
关于一维数组的问题
一般一维数组所涉及的主要问题有
按照排好序的顺序进行查找,比如对 一个升序排列的数组中,找到第一个 大于需要查找的数
折半查找(二分查找)
•培训课件数组应用技巧与方法
•10
折半查找
先给数据排序(例如按升序排好),形成
有序表,然后再将key与正中元素相比, 若key小,则缩小至右半部内查找;再 取其中值比较,每次缩小1/2的范围, 直到查找成功或失败为止。
for (i =n+1;i > L;i--) a[i]=a[i-1]
•培训课件数组应用技巧与方法
•13
有序删除
比如要删除a[d]这个元素,
则 for (j = d;j < n;j++)
a[j]=a[j+1]
•培训课件数组应用技巧与方法
•14
关于选择排序
算法:N元数组a[0]~a[N-1]由小到大排序: 第0步:找到a[0]~a[N-1]中的最小值元素与a[0]交换; 第1步:找到a[1]~a[N-1]中的最小值元素与a[1]交换; 第2步:找到a[2]~a[N-1]中的最小值元素与a[2]交换; … 第i步:找到a[i]~a[N-1]中的最小值元素与a[i]交换; … 第N-2步:找到a[N-2]~a[N-1]中的最小值元素与a[N-2]交换。 算法停止。
a50 a51 a52 a53 a54 a55 a56 12
a60 a61 a62 a63 a64 a65 a66
或自左下向右上两种方式进行,
元素可以表示为a[i-j][ j]或者
已知如下11个元素的有序表: (05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21
和85的数据元素。
Low指向待查元 mid指向待查元素所在
high指向待查元素所
素所在区间的下 界
区间的中间•培位训课置件数组应用技巧与方法 在区间的上界
•11
折半查找
① 先设定3个辅助标志: low,high,mid, 显然有:mid= (low+high)/2 ② 运算步骤:
•培训课件数组应用技巧与方法
•15
程序一
int i,j,minj,t; for (i = 0;i < N-1;i++) { for (j = i + 1;j < N-1;j++) if (a[j] < a[i]) { t = a[i]; a[i] = a[j]; a[j] = t; } }
•培训课件数组应用技巧与方法
交换排序
冒泡排序
快速排序(不稳定)
选择排序
归并排序
基数排序
•培训课件数组应用技巧与方法
•4
插入排序
插入排序的基本思想是: 每步将一个待排序的对象,按其关键码大小,插入 到前面已经排好序的一组对象的适当位置上,直到 对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的。
•培训课件数组应用技巧与方法
【3, 6, 13】, 31, 9, 27, 5, 11
【3, 6, 13,31】, 9, 27, 5, 11
【3, 6, 9, 13,31】, 27, 5, 11
【3, 6, 9, 13,27, 31】, 5, 11
【3, 5, 6, 9, 13,27, 31】, 11
【3, 5, 6, 9, 11,13,27, 31】
for(i=0;i<N/2;i++)
{
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("\n sorted array:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
}
•培训课件数组应用技巧与方法
•22
关于二维数组的问题(双下标的应 用)
涉及到矩阵的问题,一般使用二维 数组加以解决
下面举几个稍微复杂一点的例子, 也是某些考试(比如高级程序员) 经常考到的难题
蛇行矩阵问题
魔方阵问题
矩阵旋转问题
•培训课件数组应用技巧与方法
•23
蛇行方阵问题
输入:N=4 输出:1 3 4 10
2 5 9 11 6 8 12 15 7 13 14 16
优点:每趟结束时,不仅能挤出一个最大值到最后面位置, 还能同时部分理顺其他元素;一旦下趟没有交换发 生,还可以提前结束排序。
前提:顺序存储结构
例:关键字序列 T=(21,25,49,25*,16,08),请写出 冒泡排序的具体实现过程。
初态: 21,25,49, 25*,16, 08
第1趟 21,25,25*,16, 08 , 49
•培训课件数组应用技巧与方法
•24
蛇行矩阵
将自然数1,2,…,N*N,逐个顺
序插入方阵中适当的位置,这
个过程沿斜列进行。将斜列编
号为0,1,2,…,2n(以i表 记,n=N-1),从图中看出在 一斜列上各元素的下标是相等 的,且等于斜列号i。同时方阵 又可分为上三角与下三角(含
对角线)每一斜列上元素个数 为i+1个;下三角每一斜列上 元素个数为2n-i+1个。在斜列 上安排数可以使自右上向左下
(1) low =1,high =11 ,mid =6 ,待查范围是 [1,11]; (2) 若 ST.elem[mid].key < key,说明 key[ mid+1,high] ,
则令:low =mid+1;重算 mid= (low+high)/2;.
(3) 若 ST.elem[mid].key > key,说明key[low ,mid-1], 则令:high =mid–1;重算 mid ;
第2趟 21,25, 16, 08 ,25*,49
第3趟 21,16, 08 ,25, 25*,49
第4趟 16,08 ,21, 25, 25*,49 第5趟 08,16, 21, 25, 25*,49
•培训课件数组应用技巧与方法
•8
选择排序
算法:首先找到数据清单中的最小的数据,然后将这个数据同第一 个数据交换位置;接下来找第二小的数据,再将其同第二个数据交 换位置,以此类推。
•培训课件数组应用技巧与方法
•6
交换排序
交换排序的基本思想是:两两比较待排序记录的关键 码,如果发生逆序(即排列顺序与排序后的次序正好 相反),则交换之,直到所有记录都排好序为止。
交换排序的主要算法有: 1) 冒泡排序 2) 快速排序
•培训课件数组应用技巧与方法
•7
冒泡排序
基本思路:每趟不断将记录两两比较,并按“前小后大” (或“前大后小”)规则交换。
第i次,在数组a后的n-i+1个数据中,经过类似选择处理后,数组a 的第i个数据为第i小。
第n-1次,在数组后的2个数据中,经过类似处理后,总可以使数组 a的第n-1个数据为第n-1小。而这时候第n个数据是第n小。
•培训课件数组应用技巧与方法
•9
查找算法
查找之前要求排序,不然无章可查
顺序查找
• 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16
N=7 1 3 4 10 11 21 22 2 5 9 12 20 23 34 6 8 13 19 24 33 35 7 14 18 25 32 36 43 15 17 26 31 37 42 44 16 27 30 38 41 45 48 28 29 39 40 46 47 49
排序
插入
删除
查找
分类统计
涉及到一些算法,我们通过例题介绍一部分
具体问题的解题算法的思路要靠自己慢慢去体 会
•培训课件数组应用技巧与方法
•2
1. 什么是排序? 将一组杂乱无章的数据按一定的规律顺次排列起来。
存放在数据表中
按关键字排序
2. 排序的目的是什么? ——便于查找!
3.排序算法的好坏如何衡量?
}
}
for(k=0,flag1=1;k<3 && flag1;k++){
if (max>a[k][j])
flag1=0;
/*算出该数是否为列中最小*/
}
if (flag1==1){
printf("\n第%d行,第%d列的%d是鞍点\n",i,maxj,max);
flag2=1;
/*打印鞍点*/
}
即下标i要与下标n-i-1交换
•培训课件数组应用技巧与方法
•21
将一个数组逆序转换程序
#define N 5
main()
{ int a[N]={9,6,5,4,1},i,temp;
printf("\n original array:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
• 时间效率——排序速度(即排序所花费的全部比较次数) • 空间效率——占内存辅助空间的大小 • 稳定性——若两个记录A和B的关键字值相等,但排序后A、
B的先后次序保持不变,则称这种排序算法是稳定的。
•培训课件数组应用技巧与方法
•3
排序算法
插入排序
直接插入排序
折半插入排序
表插入排序
希尔排序
h = m+1;
m = (h+r)/2;
}
}
if (h > r)
printf("无此数");
else
printf("%d",m);
•培训课件数组应用技巧与方法
•20
将一个数组逆序转换
例如1,2,3,4,5,变为5,4,3,2,1
算法分析:用第一个与最后一个交换。
这是a[i],则前面已有i个元素,与它交换的元素a[k]应该满 足与a[k]后面也有i个元素,则这个元素的下 标k为:n-1i