1. 选择排序
原理论述:假如说现在有个数组,我想对它进行升序排序。选择排序的思想是,将第一个位置的元素和其后的元素逐个的进行比较,如果比第一个位置的元素小,则进行交换,第一组循环结束时,第一个位置存放了最小的数。然后用这样的方式其后位置上的元素。
时间复杂度:n的平方级别 空间复杂度:n,不需要额外的存储空间。
2. 插入排序
插入排序比选择排序的思维有所改进。选择排序是某个位置上的元素和它后面的元素进行比较,但是插入排序是某个位置上的元素和它前面的有序数组进行比较。当该元素大于有序数组的最后一位时,都没有必要和更靠前的数进行比较了。也就是因为它这个特性,插入排序对于部分有序的数组而言,算法复杂度要比选择排序低很多。但是对于完全随机的数组,算法复杂的依然是n的平方级别。
时间复杂度:最坏n的平方 最好n 空间复杂度:n,不需要额外的存储空间
3. 希尔排序
它是插入算法的改进版,改进后端算法在处理随机排序数组时,效率也会得到提升。思想:以长度n取截断数据,假设数组的长度是l,那么截断后就会产生l/n个子数组,对这l/n个子数组对应的位置进行插入排序,然后缩小n再进行上面的操作。反复执行上面的操作,直到n=1为止。
时间复杂度:不确定
4. 归并排序
原理:不断的迭代切割生成子数组,子数组中会有3个游标low,mid,high;需要比较的是low-mid,mid-high这两个区间对应位置上的元素。注意:在比较前,算法的设计是将数据拷贝到一个副本上,比较的也是副本上的元素。简单来说每次比较都会将较小的元素放入数组中,让后对应的游标加1。具体流程,记住下面的四个判断:左边用尽取右边元素,右边用尽取左边元素,左半边当前元素小于右半边当前元素取左边,反之取右边。
上面接受的算法的复杂度在最坏的情况下都是n的平方,但是归并排序可以做到n*logn级别的复杂度,但是会牺牲空间。并归排序每一次迭代都会创建一个副本去存放数据,这对空间是非常浪费的。
时间复杂度:nlogn
空间复杂度:n
5. 快速排序
快速弥补了并归排序的缺点,它的平均的时间复杂度是nlogn,空间复杂度方面,它对内存的消耗是常数级,基本可以不考虑。
最差的时间复杂度是n^2,最差的空间复杂度是n(但是概率非常小,可以忽略不计)。
原理:快速排序有两个指针i,j 分别从数组的头部和尾部开始向中间移动。基数选择,一般是会以数组的第一个元素作为基数。循环是从数组的尾端开始的,如果j位置上的数大于基数则略过,如果位置上的数小于基数,则将j位置上的数放到i位置上,然后i向右移动一位,比较移动后位置上的元素和基数。如果小于则略过,如果大于者用i位置上的元素替换j位置上的元素。如此循环,直到ij重合。此时,基数将数组一分为2,左边的小于基数右边的大于基数。然后再用上述方法处理两个子数组。
6. 堆排序
堆排序是基于二叉堆,构建起来的排序算法。二叉堆有两个特性:父元素必定大于字元素,叶子节点的层级不会超过1。
构建一个二叉堆的复杂度:2N次比较。
从2叉堆中删除掉最大元素后,采用下层算法,来构建一个新的二叉堆需要进行2logN次比较。
所以对于取最大的k个数的命题。采用堆排序的算法的复杂度为:2klogN+2N。当k=n时,就是整个数组的排序的复杂度:2NlogN+2N
本文深入讲解六种经典排序算法:选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序。详细分析每种算法的原理、时间复杂度和空间复杂度,帮助读者理解算法优劣及适用场景。

被折叠的 条评论
为什么被折叠?



