选择排序
1,简单排序算法
基本思想
在待排序的数据中选出最大(小)的元素放在最终的位置
基本操作
(1)首先通过n-1次的关键字比较,从n个记录中找出最小的关键字记录,将它与第一个位置交换。
(2)在通过n-2次的比较,从剩余的n-1个记录中找出最小的关键字记录,将它与第二个位置进行交换。
(3)重复上述操作,共进行n-1趟排序,然后结束排序。
算法实现
存储结构—记录序列以数据表存储
#define MAXSIZE 20 //设记录不超过20个
typedef int keyType; //设置关键字为int 整型
typedef struct{ //定义记录结构
keyType key; //关键字
infoType otherInfo; //其他数据项
}RedType.;
typedef struct{ //定义顺序表结构类型
RedType r[MAXSIZE+1]; //存储数据表的向量
int length; //顺序表长度
}SqList.;
简单排序算法实现
void selectSort(SqList &k){
for(int i=1;i<L.length;++i){
k=i;
for(int j=i+1;j<=L.length;j++)
if(L.r[j].key<L.r[k].key) k=j; //记录最小位置
if(k!=i) L.r[i]=L.r[k]; //交换
}
}
1,堆排序
从堆的定义可以看出,堆实质就是满足如下性质的完全二叉树:二叉树中任意非叶子节点均大于或小于它的孩子节点。
如下图所示
堆排序
定义:若在输出堆顶的最大值或者时最小值之后,使得剩余的n-1个记录序列重新组成一个堆,则得到n个元素得次小值或者次大值…如此反复,便能得到一个有序序列,这个过程称为 “堆排序”
堆得调整
如何在输出堆顶元素之后,调整剩余元素为一个新的堆,
小根堆】
(1)输出堆定元素之后,以堆中最后一个元素代替。
(2)然后将根节点得值·与左右子树节点得值进行比较,并与其中较小者进行交换,
(3)重复上述操作,直至叶子节点,将得到新的堆,我们把这个从堆定到叶子得过程称为筛选
筛选算法如图所示
堆排序算法如下
void HeapSort(elem R[]){ //对R[1]----R[n]进行排序
int i;
for(i=n/2;i>=1;i--)
HeapAdjust(R,i,n); //建立初始堆
for(i=n;i>1;i--){ //进行n-1 趟排序
Swap(R[1],R[i]); //根与最后一个元素惊醒交换
HeapAdjust(R,1,i-1); 对R[1]----R[i-1] 重新建堆
}
}