排序算法
分类:
插入排序(直接插入,希尔排序)
选择排序(简单选择,堆排序)
交换排序(冒泡排序,快速排序)
归并排序
基数排序
直接插入排序:每一步将一个待排序列根据一个元素值的大小插入已经排好序的那部分去。首个元素归入已排好序列
第二个元素跟已排好序列比较,放于那位子,后续元素递推。
希尔排序:对直接插入排序的改进,首次步长为集合长度的二分之一,步长为奇数。比较元素集合每隔步长为一组进行直接插入排序,之后
步长为上轮步长的二分之一,当步长为1,整体进行直接插入排序。
简单选择排序:元素集合每次选出最小元素。首次遍历找到最小值,与第一个元素交换,第二次遍历剩余序列找出最小值与第二个元素交换。
堆排序:堆(完全二叉树,孩子节点都大于等于父节点---小根堆,或者 孩子节点都小于等于父节点---大根堆)
因完全二叉树,则i>=N/2, i表示叶子节点
先从N/2的位置开始调整,大根堆,根节点位置都大于孩子节点,跟小则互调。
之后调整N/2-1节点,递推。如果互调后被调节点仍有孩子节点,则递归上述步骤
之后根节点与最后序列元素对调,并断开与父节点关系。后续递归
冒泡排序:每次与其相邻元素比较,一轮下来确定最大值放在最后。
快速排序:主要思想采用分治法。选首个元素为key,左指针从左到右,右指针从右到左。
如果左指针先动,相遇值比key大,相遇值需要跟key值交换。
右指针先动,寻找到比key小值,停下。左指针继续,寻找比key大的值。知道,交换数据。递归
直到左右指针相遇,交换key值
归并排序:二个一组,组内排序,二组二组进行归并(2个指针都指向首个元素,依次对比,从小到大)
基数排序:个十百千位依次排序
算法稳定性:相同关键字,他们的位子是稳定的
复杂度:
基数排序时间复杂度为O(N*M),其中N为数据个数,M为数据位数。
查找算法
ASL:平均查找长度
顺序查找:从表的一端开始,按顺序比对当前结点与关键字是否相等的一个查找方式。ASL (n+1)/2
二分查找: 有序序列每次折半对比。 ASL log2(n+1)-1
分块查找:对于顺序查找的改进, 分为查找表和索引表,查找表进行分块,块内可以无序,块间必须有序,第二块所有元素必须比第一块大,用索引表,记录块的最大关键字和块的起始地址。 ASL log2(n/s+1)+s/2