时间复杂度我们使用大O表示法进行表示,
(1)冒泡排序的时间复杂度:
1.比较相邻的元素,如果第一个比第二个大(升序),就交换他们两个
2.对每一对相邻的元素做同样的工作,从开始到结尾的最后一对
这步做完后,最后的元素会是最大的数
3.针对所有的元素重复以上的步骤,除了最后一个
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
5.稳定性:数值相同的元素在排序中不交换位置为稳定反之为不稳定
6.最优复杂度:O(n) 最坏复杂度:O(n^2) 稳定性:稳定
(2)快速排序的时间复杂度:
通过一趟排序将要排序的数据分割成独立的两部分其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列
过程描述:
1、定义一个标杆,将列表的第一个元素存入标杆,列表的第一个位置相当于空出来了
2、定义两个指针low,high,分别记录列表头和列表尾的位置
3、判断low是不是小于high,列表尾high位置的元素是不是大于等于标杆,如果是high向左移动一位
重复执行这步判断,当条件不成立时,让low位置存放当前high位置的元素
4、判断low是不是小于high,列表头low位置的元素是不是小于标杆,如果是low向右移动一位
重复执行这步判断,当条件不成立时,让high位置存放当前low位置的元素
5、让4、5两步交替执行,直到low >= high时退出循环。此时low = high
6、此时找到的low的位置就是标杆的位置,将记录的标杆元素,放置在这个位置。
7、递归执行上述步骤直到low >= high时退出。
8、最优时间复杂度计算:n拆分多少次能只剩一个元素,也就是n除以多少次2能等于1
即n/2^x = 1 –> 2^x = n –> x = logn (log以2为底,n的对数)
每次让列表中的值沿着初始值分为左右两半的过程的时间复杂度为n
所以最优时间复杂度为nlogn
9、最优复杂度:O(nlogn) 最坏复杂度:O(n^2) 稳定性:不稳定
(3)归并快速排序的时间复杂度
1、归并排序的思想是先递归分解数组,再合并数组
2、将数组分解最小之后,然后合并两个有序数组。
3、基本思路就是比较两个数组最前面的数,谁小就取谁,取了后相应的指针就往后移一位。
4、然后再比较,直至一个数组为空,最后把两一个数组的剩余部分复制过来即可。
5、最优复杂度:O(nlogn) 最坏复杂度:O(nlogn) 稳定性:稳定
(4)选择排序时间复杂度:
1、始终从未排序的序列中找到最小的放到最前面
2、将第一个元素先作为最小值,用第一个元素和后面的元素依次比较
3、首次碰见比第一个元素更小的元素就记录这个“较小元素”的位置
4、继续比较如果碰见比“较小元素”还更小的元素,就将记录的“较小元素”的位置信息,替换成“更小元素”的位置信息
5、直到比较完整个序列,最小的元素位置信息就被记录下来了
6、交换第一个元素和最小元素的位置,序列的头部就变成了最小的元素
7、再将第二个元素先作为序列剩余元素的最小元素,和剩下的元素重复上述步骤进行比较
8、将第二小的元素找到,并和第二个元素进行交换
9、多次重复上述步骤n-1次,即可得到升序序列
10、最优复杂度:O(n^2) 最坏复杂度:O(n^2) 稳定性:不稳定