对五种排序方法可以分成6大类:
存储介质:内部排序和外部排序
比较器个数:串行排序和并行排序
主要操作:比较排序和基数排序
辅助空间:原地排序和非原地排序
稳定性:稳定排序和非稳定排序
自然性:自然和非自然排序(自然排序是指输入的数据越有序,排序的速度就越快的方法,而非自然排序是指一开始输入的数据比较有序,排序的速度反而变慢的方法)
以下排序方法都以顺序存储表存储:
#define MAXSIZE 20 //设记录不超过20个
typedef int KeyType;//关键字为整型量
typedef struct {//记录每个(数据元素)的结构
KeyType key;//数据项
}RedType;
typedef struct {
RedType r[MAXSIZE + 1];//r[0]一般为哨兵位或者缓冲区
int length;
}Sqlist;
插入排序分2种:
1.直接插入排序
提示直接插入排序中数组中第一个位置为哨兵位 L.r[0]=L[i]
算法:
//直接插入排序算法
void InserSort(Sqlist& L) {
int i, j;
for (i = 2; i <= L.length; ++i) {
if (L.r[i].key < L.r[i - 1].key) {//
L.r[0] = L.[i];//复制哨兵位
for (j = i - 1; L.r[0].key < L.r[j].key; --j) {
L.r[j + 1] = L.r[j];//比哨兵位大的值都往后移动
}
L.r[j + 1] = r.[0];//将哨兵位的值插入
}
}
}
根据算法可以分析出:
时间效率:
最好情况: O(n)
最坏情况:O(n的二次方)
平均情况:O(n的二次方)
空间效率:O(1)
只额外使用了哨兵r[0]空间
算法特点: