数据结构学习笔记——排序

排序算法代码汇总

一、插入类排序

(一)直接插入排序

//用一个循环(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、已经有序:容易插、起得好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值