知识大全 数据结构考研分类复习真题 第十章 答案[47]
Posted 砾石
篇首语:世界上唯一拥有越多越好的东西就是知识。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构考研分类复习真题 第十章 答案[47]相关的知识,希望对你有一定的参考价值。
[题目分析]利用快速排序思想解决 由于要求 对每粒砾石的颜色只能看一次 设 个指针i j和k 分别指向红色 白色砾石的后一位置和待处理的当前元素 从k=n开始 从右向左搜索 若该元素是兰色 则元素不动 指针左移(即k ) 若当前元素是红色砾石 分i>=j(这时尚没有白色砾石)和i<j两种情况 前一情况执行第i个元素和第k个元素交换 之后i+ 后一情况 i所指的元素已处理过(白色) j所指的元素尚未处理 应先将i和j所指元素交换 再将i和k所指元素交换 对当前元素是白色砾石的情况 也可类似处理
为方便处理 将三种砾石的颜色用整数 和 表示
void QkSort(rectype r[] int n) // r为含有n个元素的线性表 元素是具有红 白和兰色的砾石 用顺序存储结构存储 //本算法对其排序 使所有红色砾石在前 白色居中 兰色在最后 int i= j= k=n temp; while (k!=j) while (r[k] key== ) k ;// 当前元素是兰色砾石 指针左移 if (r[k] key== ) // 当前元素是红色砾石 if (i>=j)temp=r[k];r[k]=r[i];r[i]=temp; i++; //左侧只有红色砾石 交换r[k]和r[i] else temp=r[j];r[j]=r[i];r[i]=temp; j++; //左侧已有红色和白色砾石 先交换白色砾石到位 temp=r[k];r[k]=r[i];r[i]=temp; i++; //白色砾石(i所指)和待定砾石(j所指) //再交换r[k]和r[i] 使红色砾石入位 if (r[k] key== ) if (i<=j) temp=r[k];r[k]=r[j];r[j]=temp; j++; // 左侧已有白色砾石 交换r[k]和r[j] else temp=r[k];r[k]=r[i];r[i]=temp; j=i+ ; //i j分别指向红 白色砾石的后一位置 //while if (r[k]== ) j++; /* 处理最后一粒砾石 else if (r[k]== ) temp=r[j];r[j]=r[i];r[i]=temp; i++; j++; //最后红 白 兰色砾石的个数分别为: i ;j i;n j+ //结束QkSor算法
[算法讨论]若将j(上面指向白色)看作工作指针 将r[ j ]作为红色 r[j k ]为白色 r[k n]为兰色 从j= 开始查看 若r[j]为白色 则j=j+ 若r[j]为红色 则交换r[j]与r[i] 且j=j+ i=i+ 若r[j]为兰色 则交换r[j]与r[k];k=k 算法进行到j>k为止
算法片段如下
int i= j= k=n; while(j<=k) if (r[j]== ) //当前元素是红色 temp=r[i]; r[i]=r[j]; r[j]=temp; i++;j++; else if (r[j]== ) j++; //当前元素是白色 else //(r[j]== 当前元素是兰色 temp=r[j]; r[j]=r[k]; r[k]=temp; k ;
对比两种算法 可以看出 正确选择变量(指针)的重要性
cha138/Article/program/sjjg/201311/23170相关参考
第章排序答案 一选择题 DDDBBBCEACCDFDCADFB(ACF)(BDE)CDABDDDCAACCBCCACDCBCBDDADAAACBCCBABACBDDDDCEGBCCBBACAD
cha138/Article/program/sjjg/201311/23202
typedefstructnode ElemTypedata; structnode*prior*next; node*DLinkedList; void TwoWa
()冒泡排序(HCQPAMSRDFXY) ()初始步长为的希尔排序(PACSQDFXRHMY) ()二路归并排序(HQCYAPMSDRFX) ()快速排序(FHCDPAMQRSYX) 初始
加()%()=个虚段 总读写次数为*wpl=次 类似叙述()()()略cha138/Article/program/sjjg/201311/23190
PROCEDURE StraightInsertSort(VARR:listtype;n:integer); VARij:integer; BEGIN FORi:=TOnDO&nb
二判断题 √××××××××××××√√×××××××××√×√×××√ 部分答案解释如下 错误例如冒泡排序是稳定排序将按冒泡排序排成升序序列第一趟变成此时就朝向最终位置的相反方向移动 错
typedefstruct intnum;floatscore;RecType; voidSelectSort(RecTypeR[]intn) for(i=;i<n;i++) //选
建立堆结构: () () ()
voidBiInsertSort(RecType R[]intn) //二路插入排序的算法 intd[n+];