算法与数据结构-8.排序
8.1 排序基本概念和方法概述
8.1.1 排序的基本概念
- 排序是按关键字的非递减或非递增顺序对一组记录重新进行排列的操作。
- 排序的稳定性
- 内部排序:待排序记录全部存放在计算机内存中进行排序。
- 外部排序:待排序记录的数量很大,,以致内存一次不能容纳全部记录,在排序过程中需对外存进行访问的排序过程。
8.1.2 内部排序方法的分类
(1) 插入类:
- 直接插入排序
- 折半插入排序
- 希尔排序
(2)交换类:
- 冒泡排序
- 快速排序
(3)选择类:
- 简单选择排序
- 树形选择排序
- 堆排序
(4)归并类:
- 2-路归并排序
(5)分配类:
- 基数排序
8.2 插入排序
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好的一组记录的适当位置上,直到所有待排序记录全部插入为止。
直接插入排序
(按顺序取出待排序记录的关键字,和已排序的进行比较)
void InsertSort(int a[100],int l){
for(int i=2;i<=l;++i){
a[0]=a[i];
a[i]=a[i-1];
for(j=i-2;a[0]<a[j];--j)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
在a[0]处设置监视哨。
该算法时间复杂度为O(n2)。
空间复杂度为O(1)。
算法特点:简便易实现;稳定排序;也适用于链式存储结构;更适合于初始记录基本有序的情况,当无序n较大时,时间复杂度较高不宜使用。
折半插入排序
step1. 首先确定整个查找区间的中间位置mid=(left + right ) / 2
step2. 用待查关键字值与中间位置的关键字值进行比较。若相等,则查找成功0;若大于,则在右半个区域继续进行折半查找;若小于,则在左半个区域继续进行折半查找
Step3. 对确定的缩小区域再按折半公式,重复上述步骤。 最后,得到结果:要么查找成功, 要么查找失败。= 折半查找的存储结构采用一维数组存放。
原始数据:[49, 38, 10, 97, 76, 13, 27]
第0次排序数据:[38, 49, 10, 97, 76, 13, 27]
第1次排序数据:[10, 38, 49, 97, 76, 13, 27]
第3次排序数据:[10, 38, 49, 76, 97, 13, 27]
第4次排序数据:[10, 13, 38, 49, 76, 97, 27]
第5次排序数据:[10, 13, 27, 38, 49, 76, 97]
排序后数据:[10, 13, 27, 38, 49, 76, 97]
void BInsertSort(int a[100],int n){
for(int i=2;i<n;++i){
a[0]