第1章常用算法和数据结构.PDF
文本预览下载声明
第 1 章 常用算法和数据结构
大纲要求:
排排排排。
查查排排。
数数数数(线线线、栈、队队、数数、树、图) 。
1.1 排 序 算 法
1.1.1 考点辅导
1. 选选排排
若设 R[1...n]为待排排的 n 个记录,R[1...i-1]已按照主关键字由小到大排排,且任意 x
∈R[1...i-1],y ∈R[i...n]满足 x.key ≤y.key ,则选选排排的主要思路如下。
(1) 反复从 R[i...n] 中选出关键字最小的数点R[k] 。
(2) 若 i≠k ,则将R[i]与 R[k]交换,使得 R[1...i]有排且保持原来的线质。
(3) i 增 1,直到i 为 n 。
为方便描述,被查查的顺排线 C 类型定义如下:
#define MAXSIZE 1000 /*顺排线的长度*/
typedef int KeyType; /*关键字类型为整数类型*/
typedef struct{
KeyType key; /*关键字项*/
InfoType otherinfo; /*其他数数项*/
}RecType; /*记录类型*/
typedef struct {
RecType r[MAXSIZE+1]; /*r[0]空作为哨兵*/
int length; /*顺排线长度*/
}SqList; /*顺排线类型*/
顺排存储线线线的选选排排排排如下:
void Sqsort(SqList q)
{
int i, j, k, temp;
for(i=0;iq.length-1;i++)
{
k=i;
for(j=i+1;jq.length;j++)
if(q.r[j].keyq.r[k].key)k=j; /*选选关键字最小的记录*/
if(k!=i)
{
temp=q.r[k];
q.r[k]=q.r[i];
q.r[i]=temp;
程序员考试同步辅导(下午科目)(第 3 版)
}
}
}
可见,选选排排不管原先排队是否有排,其排排需要比较的次数均为 n(n-1)/2;同时,
由于相等的两个元素,位置相对在前的可能被交换到后面,故该选选排排是不稳定的。
2. 直直直直排排
若设 R[1...n]为待排排的 n 个记录,R[1...i-1]已按照主关键字由小到大排排,则直直直
直排排的主要思路如下。
(1) 寻查 R[i]在 R[1 …i-1]中的直直位置,确保R[i]直直后保持有排。
(2) i 增 1,若 i 小于等于 n ,则转到(1)执行,否则数束。
顺排线线存储数数下的直直直直排排排排如下:
void Dinsert(SqList q)
{
int i,j,k;
for(i=1;iq.length;i++) /*q.r[0]为有排*/
{
for(t=q.r[i],j=i-1;j=0 t.keyq.r[j].key;j--)/*查到直直的位置*/
q.r[j+1]=q.r[j];
显示全部