排序
冒泡
依次比较相邻两个数,把最大的数冒泡到最后。
插入排序
类比摸扑克牌,稳定
void InsertionSort( ElementType A[], int N )
{ /* 插入排序 */
int P, i;
ElementType Tmp;
for ( P=1; P<N; P++ ) {
Tmp = A[P]; /* 取出未排序序列中的第一个元素*/
for ( i=P; i>0 && A[i-1]>Tmp; i-- )
A[i] = A[i-1]; /*依次与已排序序列中元素比较并右移*/
A[i] = Tmp; /* 放进合适的位置 */
}
}
希尔排序
插入排序+增量(依次递减)
对每个增量N考虑间隔为N的子序列,分别排序
选择排序
每次遍历序列,找最小元,swap到前面。
堆排序
也可以使用建立最大堆方法,建堆后把最大的顶点和最后的数据交换,然后对剩下的数据再次建堆。
归并排序
快速排序
分治
表排序
移动元素的代价比较大,我们选择不移动元素而移动指向他们的指针,这里的指针并不一定指c语言里面的指针,也包括下标
桶排序
空间换时间
基数排序
- 基数排序:根据键值的每位数字来分配桶;
查找
散列查找
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。又称为哈希(Hash)函数。
构造:
直接定址法
除留余数法
数字分析法、折叠法、平方取中法
处理冲突:
开放定址法:线性探测、平方探测、双散列
链接法:将所有关键字为同义词的记录存储在一个单链表中
公共溢出区法:
ASL
评价
查找平均长度取决于:
- 散列函数是否均匀
- 处理冲突的方法
- 散列表的装填因子 装填因子=填入表中的记录个数/散列表长度。(表示散列表的装满的程度) 当填入表中的记录越多,装填因子越大,产生冲突可能性越大。
牺牲空间换时间