常用数据算法
(1)、冒泡排序
从第一个数开始,相邻元素两两对比,小的数放前面。(每循环一次,最后一个数都会被确定下来,为每轮的最大数)
(2)、选择排序
从第一个数开始,循环一圈找最小的数交换位置。(每循环一圈,第一个数都会被确定下来,为每轮最小的值)
(3)、插入排序
从第二个数开始,跟前一个数比较,若比前一个数小,则交换位置,接着跟前一个数比较,直到比前一个数大为止。(从第一张开始整理扑克牌,小的往前插)(可能会出现一个数从最后比较到最前面,比较费时)
(4)、希尔排序
希尔排序属于插入类排序,是将整个有序序列分割成若干个小的子序列分别进行插入排序。
排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序,然后取d2<d1,重复上述分组和排序操作,直至d1=1,即所有记录放进一个组中排序为止。(将每间隔一定步距的数取出来进行比较,比如gap=5,就是把第1个、第6个、第11个…数取出来进行插入排序)
优点:当n值很大时,数据项每一趟排序需要移动的个数很少,但数据项的距离很长;当n值减小时,每一趟需要移动的数据增多,此时已经接近于它们排序后的最终位置。
希尔分析:
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。
(5)、归并排序
归并排序有两种实现方法:自上而下的递归;自下而上的迭代。下面讲递归法:
将原数组用二分法一直分到两个数为一组,然后通过比较将较小的数放到前面(通过一个中间数组排序);然后一层层向上排序。
(就是两个数比较进行排序,然后两组(四个数)进行比较排序,然后两组(八个数)进行比较排序…)
(6)、快速排序
快速排序思想:先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。 左右分别用一个空数组去存储比较后的数据。最后递归执行上述操作,直到数组长度<=1。
特点:快速,常用。缺点是需要另外声明两个数组,浪费了内存空间资源。
2、最快的排序算法是哪个?
快速排序时最快的排序算法。
3、手写一个冒泡排序
4、手写快速排序代码
5、快速排序的过程、时间复杂度、空间复杂度
快速排序原理:
(1)、定义一个基准元素base(我这里定义最左边的元素定位基准元素)
(2)、定义两个变量i和j
(3)、j先从右向左遍历,找到第一个比base小的数就停止。
(4)、i从左往右遍历,找到第一个比base大的数就停止。
(5)、如果i和j不相等,交换i和j指向的元素。
(6)、直到i和j指向同一元素,将这个元素与基准元素交换
(7)、递归求解
图解:
6、手写堆排序
7、堆排序过程、时间复杂度及空间复杂度
将待排序的序列构造成一个大顶堆。此时,这个序列最大值就是堆顶的根节点。将其与数组末尾元素进行交换,此时末尾元素就是最大值,然后将剩余的n-1个序列重新构造成一个堆,这样就可以得到n-1个元素的次大值。如此反复执行,便能得到一个有序序列了。
堆排序的时间复杂度是O(n log n)
空间复杂度为O(1)