数据结构(Java版)排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排序
12
直接插入排序实例
初始关键字序列: i=1(33) i=2(62) i=3(96) i=4(87) i=5(17) i=6(28) i=7(51) [51] [33 [33 [33 [33 [17 [17 [17 33 51] 51 51 51 33 28 28 62 62 62] 62 62 51 33 33 96 96 96 96] 87 62 51 51 87 87 87 87 96] 87 62 51 17 17 17 17 17 96] 87 62 28 28 28 28 28 28 96] 87 51 51 51 51 51 51 51 96]
排序
13
课堂练习与算法设计
一组关键字(19,
1,26,92,87,11,43,87,21),进行插 入 排序,试列出每一趟排序后的关 键字序列 19, 1,26,92,87,11,43,87,21 i=1 1,19,26,92,87,11,43,87,21 i=2 1,19,26,92,87,11,43,87,21 i=3 1,19,26,92,87,11,43,87,21 i=4 1,19,26, 87,92,11,43,87,21 i=5 1, 11,19,26, 87,92,43,87,21 i=6 1, 11,19,26, 43,87,92,87,21 i=7 1, 11,19,26, 43,87,87,92,21 i=81, 11,19,21,26, 43,87,87,92
排序
14
快速排序
基本思想:首先将待排序记录序列中的所 有记录作为当前待排序区域,从中任选取 一个记录(通常可选第一个记录),以它 的关键字作为枢轴(或支点)(pivot), 凡其关键字小于枢轴的记录均移动至该记 录之前,反之,凡关键字大于枢轴的记录 均移动至该记录之后
排序
8
排序
直接选择排序实例
初始关键字序列: 51 33 62 96 87 17 28 ↑ ↑ 第一趟排序后: [17] 33 62 96 87 51 28 ↑ ↑ 第二趟排序后: [17 28] 62 96 87 51 33 ↑ ↑ 第三趟排序后: [17 28 33] 96 87 51 62 第四趟排序后: [17 28 33 51] 87 96 62 第五趟排序后: [17 28 33 51 51] 96 62 第六趟排序后: [17 28 33 51 51 62] 96 第七趟排序后: [17 28 33 51 51 62 87
排序
51 51 51 51 51 87 87 96]
9
课堂练习与算法设计
选择排序过程: 34 i=1 i=2 i=3 i=4 i=5 i=6 12 3 3 3 3 3 3 45 12 12 12 12 12 12 21 45 45 21 21 21 21 87 21 21 45 26 26 26 26 87 87 87 87 34 34 3 26 26 26 45 45 45 算法设计: n=a.length; for(i=0,i<n-1;i++){ 从a[i]…a[n-1]中找出最小的元 素放到a[i]处 min=i; for( j=i-1j<n-1;j++) if(a[min]>a[j])min=j; if(min!=i) 交换a[min]和a[i] }
排序
深圳职业技术学院软件系
基本概念
排序: 将n个数字按一定顺序排列(比如:升序, 或者降序) 班上有 30 个学生,按照学号进行由小到大 的排序
排序
2
基本概念
内部排序 :若整个排序过程不需要访问外 存便能完成,则称此类排序问题为内部排 序 外部排序:若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中完成, 则称此类排序问题为外部排序
void quickSort(int a[ ],int s,int t){
if(s<t){ k=partion(a,s,t); quickSort (a,s,k-1) quickSort (a,k+1,t) } } int partion(int a[],int l,int r){ temp=a[l];j=r;i=l; while(i<j){
[62] 96 87 i↑ [17] 96 87 i↑ 17 [96] 87 i↑
完成一趟排序:
28
33
17
排序
[51] 87
96
62
51
16
快速排序结果
初始关键字序列: 51 33 62 96 87 17 28 51 一趟排序之后: [28 33 17] 51 [87 96 62 51] 分别进行快速排序:[17] 28 [33] [51 62] 87 [96] 51 [62]
排序 3
Fra Baidu bibliotek
几种常用的排序方法
冒泡排序 选择排序 快速排序 插入排序 希尔排序 归并排序
排序
4
冒泡排序
基本思想:对所有相邻记录的关键字值进 行比较,如果是逆序(a[j]>a[j+1]),则将 其交换,最终达到有序化
排序
5
冒泡排序实例
初始关键字序列:
51 33 62
51 33 62 96 87 17 28 51
34 34 34 34 87 87
排序
10
插入排序
主要思想:不断地将待排序的数值插入到 有序序列中,使有序序列逐渐扩大,直至 所有数值都进入有序序列中位置 插入排序种类:直接插入排序、折半插入 排序、二路插入排序、表插入排序和希尔 排序
排序 11
直接插入排序
基本思想:将记录R[i]插入到有序子序列 R[0..i-1]中,使记录的有序序列从R[0..i-1] 变为R[0..i]
排序
20
96 87 17 28 51
第一趟排序结果:
33 51 62
33 51 62 87 17 28 51 [96]
87 17 28 51 96
第二趟排序结果: 第三趟排序结果: 第四趟排序结果: 第五趟排序结果: 第六趟排序结果:
33 33 33 17 [17
51 51 17 28 28
62 17 28 33 33
17 28 51 [51 51
28 51 51 [62 [51 62 51 62 51 62
[87 87 87 87 87
96] 96] 96] 96] 96]
6
排序
课堂练习与算法设计
一组关键字 (19,01,26,92,87,11,43,87,21),进行冒 泡排序,试列出每一趟排序后的关键字序 列 19,1,26,92,87,11,43,87,21 i=1 1 19 26 87 11 43 87 21 92 i=2 1 19 26 11 43 87 21 87 92 i=3 1 19 11 26 43 21 87 87 92 i=4 1 11 19 26 21 43 87 87 92 i=5 1 11 19 21 26 43 87 87 92 i=6 1 11 19 21 26 43 87 87 92 i=7 1 11 19 21 26 43 87 87 92 i=8 1 11 19 21 26 43 87 87 92
从j位置逐个比较temp和a[j],把比temp小 的元素调到a[i]处; 从i位置逐个比较temp和a[i],把比temp大的 元素调到a[j]处;
} return j; }
}
排序 18
排序方式比较
排序方法 平均时间 O(n2) 直接插入排序 O(n2) 冒泡排序 O(n2) 直接选择排序 O(n1.3) 希尔排序 O(nlog2n) 快速排序 O(nlog2n) 堆排序 2路归并排序 O(nlog2n)
算法设计: void insertSort(int a[]){ n=a.length; for(i=1;i<n;i++){ 将a[i]插入到a[0]…a[i-1]中,保持原来的排序 1 在a[0]…a[i-1]中找到插入的位置j 2 把a[j]…a[i-1]逐个后移一个位置 (a[i-1]移到a[i],…a[j]移到a[j+1]]) 3 把a[i]放到a[j]处 } }
排序
最坏情况 O(n2) O(n2) O(n2) O(n1.3) O(n2) O(nlog2n) O(nlog2n)
辅助空间 O(1) O(1) O(1) O(1) O(log2n) O(1) O(n)
19
综合项目实践
164页实战演练:
设计一个项目可以对5000个数进行排序,计算并比较各种排序的 时间。运行界面如下.
15
快速排序一趟排序过程
初始关键字序列: [51] 33 R[0]=51 i↑ 第一次交换之后: [28] 33 i↑ 第二次交换之后: 28 33 第三次交换之后: 第四次交换之后: 28 28 33 33 62 62 96 96 87 87 51 j↑ 17 [28] 51 j↑ 17 [62] 51 j↑ [17] 62 51 j↑ [96] 62 51 j↑ 17 28
算法设计: for(int i=1;i<=a.length-1;i++) for(j=0;j<a.length-1-i;j++) if(a[j]>a[j+1]) 交换a[j]和a[j+1]
编程实现
排序
7
选择排序
基本思想:依次从待排序记录序列中选择出关键 字值最小(或最大)的记录、关键字值次之的记 录、……,并分别将它们定位到序列左侧(或右 侧)的第1个位置、第2个位置、……,从而使待 排序的记录序列成为按关键字值由小到大(或由 大到小)排列的有序序列。 选择排序种类:直接选择排序和堆排序
有序序列:
17 28 33 51 51 62
87 96
排序
17
算法设计:
课堂练习与 算法设计
给出一组关键字 ,快速排序的每一趟的 排序结果: 46,58,15,45,90,18,10,62,87,23 t=46 t=46 t=46 t=46 t=46 23,58,15,45,90,18,10,62,87,23 i j 23,58,15,45,90,18,10,62,87,58 i j 23,10,15,45,90,18,10,62,87,58 i j 23,10,15,45,90,18,90,62,87,58 ij 23,10,15,45,46,18,90,62,87,58 ij