算法:
解决问题的方法和步骤(数据结构所具备的功能)。
特征:有穷性、确切性、输入项、输出项、可行性
评定:
时间复杂度:随着输入项的变化,算法运算的次数,一般采用大O表示法。
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(2^n)<O(n!)
空间复杂度:随着输入项的变化,算法所需要内存的变量,一般采用大O表示法。
O(1)<O(n)<O(2n)
正确性
可读性
健壮性
排序算法:
**冒泡排序:**
特点:对数据的有序性敏感,一旦排序完成就能停止。
时间复杂度:
最优:O(n) 最差:O(n^2)
**选择排序:**
特点:交换数据的次数比其它算法少。
时间复杂度:O(n^2)
**插入排序:**
特点:把数据分为两部分,一部分有序,一部分无序,把无序中的数据逐个往有序部分中插入,适合向已经排序好的数据中添加新的数据。
时间复试度:O(n^2)
**希尔排序:**
特点:是插入排序的改进版,通过缩减增量来提高排序速度的一种方法。
时间复杂度:O(n^1.3) O(n^2)
**快速排序:**
特点:先确定一个标杆,先从左边找比标杆大的数据与标杆交换,再从右边找比标杆小的数据与标杆交换,达到标杆左边的数据都比它小,右边的都比它大,达到大致有序的效果,然后再使用同样的方法排序标杆左边的数据,然后再排序标杆右边的数据,直到排序完成。
时间复杂度:O(nlogn),O(n^2)
**堆排序:**
特点:把待排序的数据看作一个完全二叉树,先构建成在根堆或小根堆,然后把堆顶与最后一个数据交换,再把待排序的数据-1,然后再调整堆,直到排序完成。
时间复杂度:O(nlogn)
**归并排序:**把待排序的数据分隔成一个个子结构,然后把这些子结构按从小到大的顺序复制到临时空间,复制完成后再从临时空间拷贝到原空间,这样就排序完成,该算法使用复制过程代替交换过程,以此提高排序速度,是一种典型的使用空间换取时间的算法。
时间复杂度:O(nlogn)
**计数排序:**把待排序的数据中的最大值最小值,然后创建哈希表,统计每个数据出现的次数,然后按从小到大的顺序访问哈希表,当哈希表中的数据不为零说明数据现为待排序的数据,然后把它存放到数组中。
缺点:创建哈希表时需要额外的内存,最大值与最小值不确定,可能效率非常低,只适合对数据之间差值不大、重复性高的数据进行排序。
时间复杂度:O(n+k)
**桶排序:**先按照数据的规模创建桶,然后再把数据分散到桶中,然后调用其它排序算法把桶进行排序,然后再把桶中的数据合并到数组中,该算法是通过降低待排序数据的规模来提高排序速度。
缺点:如何分桶,桶定义多大,这些都需要对有数据有大致的了解。
时间复杂度:O(n+k)
**基数排序:**创建10个队列,把待排序的数据逐个识别个位数据,然后根据识别的结果把数据存储到10个队列中,然后从队列出依次弹出,然后是十位、百位...重复这一过程,直到所有数据的最高位为0。
缺点:只适合排序正整数据。
时间复杂度:O(n+k)