数据结构之查找与排序.ppt

数据结构之查找与排序

* void selectsort(elemtype x[],int n){ int i,j,small,temp; } for( i=0;in-1;i++){ } small=i; for( j=i+1;jn;j++){ if(x[ j ].keyx[small].key) small = j; } if(small!=i){ temp = x[i]; x[i] = x[small]; x[small] = temp;} x[i] x[small]; 简单选择排序 * 排序 简单插入与简单选择算法的比较 排序效率 简单插入算法搬移元素的次数较多 简单选择算法比较元素的次数较多,但搬移次数少 对于一个基本有序的表,倾向使用 算法 对于一个顺序混乱的表,倾向使用 算法 简单插入 简单选择 例:1 2 3 4 5 7 6 * 排序 简单插入与简单选择算法的比较 稳定性: 简单插入算法是 ? 简单选择算法是 ? 稳定的 不稳定的 算法的稳定性: 对相同排序码的元素之间相对位置的维持 保持相对位置不变--稳定算法 不一定保持相对位置--不稳定算法 1 4 2 3 3 例: * 排序 冒泡排序 6.3 冒泡排序 基本思想:逐个交换次序不当的相邻表项,多趟扫描后得到排序表 3 19 2 4 13 10 交换 19 2 交换 19 4 交换 13 19 10 19 交换 * 排序 冒泡排序 冒泡 最大的元素在第一趟算法中排到了(冒)表尾 次大的元素在第二趟算法中将冒到倒数第二 逐趟冒泡,我们就获得排序表 3 19 2 4 13 10 19 2 19 4 13 19 19 10 13 13 10 2 3 * 排序 冒泡排序 算法分析 (1)多趟扫描的框架 每一趟扫描,都将一个最大的元素排到表尾。 每一趟扫描,未排序子表减少一格 for( turn = 0 ; turn table-length -2 ; turn ++ ){ 核心算法:从前向后,每两个元素根据大小交换位置。 } for(turn = table-length-1;turn 1;turn - -){ 核心算法: } turn:未排序子表结束位置 法一 法二 * 排序 冒泡排序 (2)核心算法,从前向后逐个比较相邻元素的排序码,并根据大小关系交换元素位置 for( i = 0 ; i turn-1 ; i++){ if( table-data[ i ].key table-data[ i+1 ].key){ } } temp = table-data[ i ]; table-data[ i ] = table-data[ i+1 ]; table-data[ i+1 ] = temp; table-data[ i ] table-data[ i+1 ] * 排序 冒泡排序 改进 不一定要进行table-length-1趟,当发现有一趟算法中没有发生交换事件,说明表中的元素已经排好序了。 void bubble_sort( table){ for(turn = table-length-1 ; turn 1 ; turn--){ for( i = 0 ; i trun - 1; i++) if( table-data[ i ].key table-data[i+1].key){ table-data[ i ] table-data[i+1]; } } } } 课堂练习:将改进加入算法中 * 排序 冒泡排序 改进: 加一个标志位 void bubble_sort( table){ for(turn = table-length-1 ; turn 1 ; turn--){ flag = 0; for( i = 0 ; i trun - 1; i++) if( table-data[ i ].key table-data[i+1].key){ table-data[ i ] table-data[i+1]; flag = 1; } if(flag == 0) break

文档评论(0)

1亿VIP精品文档

相关文档