数据结构学习笔记(二)各种排序

一 选择排序

1.1简单选择排序

基本思想:在当前无序序列中选择一个关键字最小的记录,并将它与最前端的记录交换。

算法分析:算法分析:对无序序列进行n-1次扫描,第i次扫描要进行n-i次比较,则总的比较次数为(n-1)+(n-2)++2+1=n(n-1)/2;每交换一次需要进行三次记录移动,其最大移动次数为3(n-1)。得总的时间复杂度为O(n^2)。

1.2堆排序

基本思想:堆顶元素具有最大值,若输入堆顶元素后,将剩余的n-1个元素重新建成堆,则可得到次大元素,如此反复执行,便能得到一个有序序列。

排序过程:

•将现有的序列构成一个堆——构造堆
•输出堆顶元素,重新调整元素,构成新堆,直到堆空为止——调整堆
构造堆:所有i>n/2的结点ki是叶子结点,可认为以这些结点为根的子树已是堆。则需从第n/2个元素开始直到根结点(第1个元素)为止,逐步进行调整,使此完全二叉树构成堆。
调整堆:将堆顶元素与堆中最后一个元素交换,并从堆中删除该元素,将余下元素重新调整成堆,反复进行直到堆空为止。

算法分析:O(nlog n)

二 插入排序

2.1 线性插入排序(带监视哨)

基本思想:每一趟将一个待排序的结点,按其关键值的大小插入到已经排序的序列中适当位置上,直到全部插完为止。

算法分析:算法复杂度最好情况为O(n);最坏O(n^2);平均O(n^2);

2.2 折半插入排序

基本思想:在插入排序的有序区中用“对分查找”搜索插入位置,然后再插入;

算法分析:算法复杂度最好情况为O(n);最坏O(n^2);平均O(n^2)。

三 交换排序

3.1 冒泡排序

基本思想:将待排序的结点顺次两两比较,若为逆序则进行交换,使关键字最小的结点如气泡一般逐渐往上“漂浮”直至“水面”,而将关键字最大的结点“沉入水底”;

算法分析:算法复杂度最好情况为O(n);最坏O(n^2);平均O(n^2);

3.2 快速排序

基本思想:在待排序的n个结点中任取一个结点(通常取第一个结点),把该结点放入最终位置后,数据序列被该结点分割成两部分,比该结点小的结点在其前面,比它大的结点放在后一部分,这个过程为“一趟快速排序”。之后对所有的两部分分别重复上述过程,直至每部分只有一个结点为止;

算法分析:最坏O(n^2);最好O(nlog n);平均O(nlog n)

 

 

 

 

 

 

 

    原文作者:爱上健身的菇凉
    原文地址: https://blog.csdn.net/XIAXIA__/article/details/8781243
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞