每日一题LeetCode+算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huitailang1991/article/details/77711803

先在github的reademe完成,定期更新到blog上。

LeetCode

链接是leetcode地址:

算法与数据结构

八大排序/sort/basic_sort.py,这里也推荐一个文章,可以视觉感受排序算法,不过看看图就好,算法没解释太多,算法内容比较详细的还是得看看《算法导论》,比较系统:

  • [x] [冒泡bubble],冒泡排序因为是在原数组上直接操作,所以它占的空间资源较少,在数据量不大的情况还是挺好的。但是由于算法涉及双重循环,所以在数据量大的情况下,程序运行的时间是相当长的,因为要一次一次地遍历数据。
  • [x] 插入排序,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
  • [x] 希尔排序,希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。相比插入排序:1.插入排序每次只能将一位数据移动,一般很低效;2.但是插入排序在操作几乎排序好的数据时,很高效,也就是当增量减小到一定程度的时候。
  • [x] 快速排序,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。数据量大时比希尔快接近一倍。
  • [x] 直接选择排序,基本思想:第1趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换;第2趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;以此类推,第i趟在待排序记录r[i] ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。数据大时性能很低。
  • [x] 堆排序,堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
  • [x] 基数排序,基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

这个是用plot_data.py绘制的各个排序算法在不同量级的比较,太慢的我就屏蔽了。

compare

  • [x] Hash,见/Hash目录。

稳定排序和不稳定排序

参考

简单说就是,如果有两个相同的数,在排序前后相对位置关系不变。

  • 稳定排序:冒泡,插入,归并,基数排序
  • 不稳定排序:选择,快速,希尔,堆排序

时间复杂度

猜你喜欢

转载自blog.csdn.net/huitailang1991/article/details/77711803