第八章主要学习排序的相关算法。
通过这章,了解到有很多比较好的排序方式,这章也比较强调对算法存储结构的理解,对算法的编写要求不是太大。
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; }
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); } }
快排在最坏的情况下会退化为O(n²)的时间复杂度(原序列有序的时候)
3、选择排序
简单选择排序其实在上学期学过了,其实就是比较+交换的过程,算法的话也比较熟悉了。
这一小节的重点是堆排序。堆排序的引出是为了解决简单选择排序时间复杂度比较大的问题。
堆排序包括建初堆和调整堆两大步骤。其中堆的概念需要明白。最大堆是指根节点的值不小于其左右结点,最小堆是指根节点的值不大于其左右结点。
4、最后就是归并排序了
归并排序是将多个有序的序列合并到一起。在前面的章节中也有提及到这个概念。归并排序是稳定的排序。归并排序的主要作用在于解决外排序数据量超过内存大小的问题,它可以分块进行分块记录。