排序算法复杂度

冒泡排序

Java中的经典算法之冒泡排序(Bubble Sort) https://www.cnblogs.com/shen-hua/p/5422676.html

选择排序

入排序

希尔排序

图解排序算法(二)之希尔排序

https://www.cnblogs.com/chengxiao/p/6104371.html

快速排序

坐在马桶上看算法:快速排序

http://developer.51cto.com/art/201403/430986.htm

归并排序

堆排序

基数排序


算法复杂度

算法复杂度分为时间复杂度和空间复杂度。

时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。

时间复杂度

影响我们算法性能的主要部分是循环交换,显然,次数越多,性能就越差。

举例--冒泡排序

 int data[7] = {10,9,8,7,6,5,4};
倒序(最糟情况)
  第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
  第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
  第一轮:7,8,10,9->7,8,9,10(交换1次)
  循环次数:6次
  交换次数:6次
其他:
  第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
  第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
  第一轮:7,8,10,9->7,8,9,10(交换1次)
  循环次数:6次
  交换次数:3次

循环的次数是固定的,为1+2+...+n-1。写成公式就是1/2*(n-1)*n。


  现在注意,我们给出O方法的定义:
  若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没学好数学呀,对于编程数学是非常重要的!!!)
  现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)
  =O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。


再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的
  有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),
  复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的
  原因,我们通常都是通过循环次数来对比算法。


参考资料:

排序算法总结 https://www.jianshu.com/p/ae97c3ceea8d


猜你喜欢

转载自blog.csdn.net/haobobo710/article/details/80915512