第八章学习小结

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

 

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

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、最后就是归并排序了

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

 

posted @ 2020-07-12 22:21  江振宇  阅读(163)  评论(0编辑  收藏  举报