• 第八章学习小结


    第八章主要学习排序的相关算法。

    通过这章,了解到有很多比较好的排序方式,这章也比较强调对算法存储结构的理解,对算法的编写要求不是太大。

    1、从插入排序来说

      主要讲了直接插入排序和折半插入排序,希尔排序的话也了解了一下。插入排序的关键是“比较”和“后移”。比较就是对数的比较,基于要求进行升序或降序排列。后移就是在比较成功后预留位置去插入。

      算法的特点:它是稳定的排序,但是当数据量比较大的时候,算法的时间复杂度过高。

    2、对交换排序来说

      主要介绍了冒泡排序和快速排序。其中这里的重点是快速排序。

      冒泡排序简单来说就是每次确定一个元素的最终位置,比如说按升序排序的话,每次循环结束都将最大的元素推到最后。

      **快速排序:快排是非常重要的,所以我也自己去研究了下算法。

    int Partition(int *a,int low,int high){
        a[0]=a[low];/*更新位置*/
        while(low<high){
            /*从末端开始查找*/
            while(low<high&&a[high]>=a[0]){
                high--;
            }
            a[low]=a[high];
            
            while(low<high&&a[low]<=a[0]){
                low++;
            }
            a[high]=a[low];
        }
        a[low]=a[0];/*该元素的最终位置*/
        return low;
    }
    View Code
    void QSort(int *a,int low,int high){
        if(low<high){
            int pos=Partition(a,low,high);/*获得中枢位置*/
            QSort(a,low,pos-1);
            QSort(a,pos+1,high);    
        }
    }
    View Code

      快排在最坏的情况下会退化为O(n²)的时间复杂度(原序列有序的时候)

     

    3、选择排序

      简单选择排序其实在上学期学过了,其实就是比较+交换的过程,算法的话也比较熟悉了。

      这一小节的重点是堆排序。堆排序的引出是为了解决简单选择排序时间复杂度比较大的问题。

      堆排序包括建初堆和调整堆两大步骤。其中堆的概念需要明白。最大堆是指根节点的值不小于其左右结点,最小堆是指根节点的值不大于其左右结点。

    4、最后就是归并排序了

      归并排序是将多个有序的序列合并到一起。在前面的章节中也有提及到这个概念。归并排序是稳定的排序。归并排序的主要作用在于解决外排序数据量超过内存大小的问题,它可以分块进行分块记录。

     

  • 相关阅读:
    ( KMP 求循环节的个数)Power Strings -- poj -- 2406
    (矩阵快速幂) Fibonacci -- poj -- 3070
    (字符串处理)Fang Fang -- hdu -- 5455 (2015 ACM/ICPC Asia Regional Shenyang Online)
    (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)
    (最短路 spfa)Wormholes -- poj -- 3259
    (水题) Div 3 -- SGU -- 105
    (水题)987654321 problem -- SGU 107
    (最短路 dijkstra)昂贵的聘礼 -- poj -- 1062
    (欧拉公式 很水) Coprimes -- sgu -- 1002
    (广搜) Find a way -- hdu -- 2612
  • 原文地址:https://www.cnblogs.com/jintao1990/p/13290334.html
Copyright © 2020-2023  润新知