排序算法代码汇总
一、插入类排序
(一)直接插入排序
//用一个循环(for)遍历待排序序列的关键字
//for循环里嵌套,一个循环(while)比较temp和有序序列关键字的大小
如果temp比有序序列里关键字小,做两件事情
1)有序序列关键字后移
2)继续往前遍历比较,则 - - j
for(i = 1; i < n; ++i)
{
temp = R[i];
j = i - 1;
};
while(j >= 0; temp < R[j])
{
R[j+1] = R[j];
- - j;
};
(二)希尔排序
1、希尔排序思想
增量越大,分割后的子序列中关键字个数越少;不断缩小增量,子序列中关键字的个数越来越多;每一趟排序会使得序列变得更加有序,等基本有序再来一趟直接插入排序,使得排序效率更加高效
2、考研重点考察:1)执行流程 2)希尔排序增量选取的注意点
1)执行流程
①按增量分割序列为多个子序列
② 在分割出来的子序列中实现直接插入排序
③ 缩小增量,重复上述两步
2)希尔排序中增量选取的注意点
①最后一个增量为1
②增量序列中的值尽量没有除1以外的公因子
二、选择排序
(一)简单选择排序
//不停在无序序列中选出最小,放入无序序列中的第一个位置
具体实现:
1、两个for循环,1)第一个for循环
①确定无序序列的首项下标序号
②并设无序序列首项关键字为最小值
2)第二个for循环
①找到新无序序列中最小值
②循环结束后将无序中遍历出的最小值R[k]与无序序列第一个关键字R[i]交换
(二)堆排序
1、算法思想重编
1)首先理解何为堆,是一种新的数据结构,是一种特殊的完全二叉树,特点是,要么根结点值均大于叶子结点,要么根结点值均小于叶子结点,即大顶堆和小顶堆
2)堆排序
首先将无序序列建堆,然后通过不断调整,将不符合堆定义的完全二叉树变为符合堆定义的完全二叉树
2.1)如何调整(以大顶堆「从小到大排列」为例)
① 开始于何点,按什么顺序调整:(如何移动全局根)
数据上是:即确定i和j;第一步是i=n/2,后续是递减1
视觉上:是第一个调整的顶点是完全二叉树最后一个非叶子结点,从右到
左,从下至上;对每个结点进行调整
②对结点的调整方法:(如何移动局部根)
做两件事情:
一孩子间先互相比较,选出最大的,确定j的位置
二父子之间互相比较:case1:父比子大,break;
case2:父比子小,调整两样:1父子互换,2下移i和j
局部根调好后,再移全局根;全局根的移动方法即是上述①所说
3)堆排序
建立好一个大顶堆后,进行排序,排序结果即大顶推的顶点进入有序序列,达到最终位置,无序序列中关键字个数-1个,有序序列中关键字个数+1个
3.1)如何排序
①将树中的根结点(即无序序列中第一个关键字)与树中最后一个叶子结点(即无序
序列中最后一个关键字)交换;此时根结点进入有序序列,无序序列-1
②重新调整新顶点shif(R,1,i-1)使其满足堆定义
4)重复3)堆排序,直至无序序列中关键字剩下1个时排序结束
2、代码
1)堆调整
//用个while循环(左孩子 下标小于最后一个结点的下标)
两个判断:一是右孩子是否大于左孩子,if yes 下标右移
二是孩子结点是否大于根结点,if yes 做两件事情:一是根结点与孩子结点
替换,二是修改下移i 和j的值,即根结点到下层后重复上述过程
2)堆排序
//根结点与最后一个结点的互换,以及重新堆调整
3)用for循环+调整堆函数来建初始堆
三、交换排序
(一)起泡排序
要点精炼:
1、前后两个比较,大的放后,小的放前
2、一趟气泡排序后最大的达到它最后的位置,外循环次数逐次递减
3、泡泡有个旗,不交化了就为0;[设置flag,没有发生交换flag为0例,此时及时停止循环]
(二)快速排序
要点精炼:
1、选无序序列第一个设为枢轴,一趟选择后,比枢轴小的在枢轴左边,比枢轴大的在枢轴右边
2、整个过程是交替扫描和交换的过程。右端扫描指针发现小的,交换关键字;轮到左端扫描,左端指针发现大的,交换关键字;轮到右端扫描,如此交替,直至ij相遇
3、一趟结束后得到更短的子序列,递归扫描。
复杂度和稳定性快记
1、不稳定:情绪不稳定,快些选一堆好友聊天;快速排序、希尔排序、简单选择排序、堆排序
2、军队时间观念强:快些以nlog2n的速度归队:快速排序、希尔排序、归并排序、堆排序
3、有个空间叫快病鸡:快速log2n、归并n、基数rd
4、已经有序:容易插、起得好