算法入门---java语言实现的冒泡排序小结

来源:互联网 发布:画江湖之换世门生知乎 编辑:程序博客网 时间:2024/05/21 08:51
  1. public class BubbleSort {
  2. /**
  3. * 冒泡排序 顾名思义:每次比较两个数,然后当顺序有错误的时候进行交换。
  4. * 这样看起来就是慢慢的把最小的冒出水面。
  5. * 算法实现:也是通过两层for循环进行,最外层的for循环每执行一次就会把 最小的气
  6. * 泡冒到前面(前面这些是已经排好序的),然后第二次的时候就不去比较这几个了通过外层循环控制。
  7. * 这样就会大大的减少没用的操作。
  8. *
  9. * @param src
  10. */
  11. public static void sort(int[] src) {
  12. int len = src.length;
  13. //这是最基本的没用任何算法的排序,效率比较低下,有时候会做重复的事情.
  14. /*for (int i = 0; i < len; i++) {
  15. for (int j = i + 1; j < len; j++) {
  16. if (src[j] > src[i]) {
  17. int temp = src[i];
  18. src[i] = src[j];
  19. src[j] = temp;
  20. }
  21. }
  22. }*/
  23. //采用冒泡算法,最外层从第一个元素开始循环
  24. for(int i = 0; i < len; i++){
  25. //从最后面开始进行冒泡,是比较小就往前。
  26. for(int j = (len-1);j > i;j--){
  27. //比较小就直接进行交换。
  28. if(src[j] < src[j-1]){
  29. int temp = src[j];
  30. src[j] = src[j-1];
  31. src[j-1] = temp;
  32. }
  33. }  
  34. }
  35. }
  36. public static void main(String[] args) {
  37. int[] src = {55,77,33,44,22,1,9,0,3,9,-34,9999,-66};
  38. sort(src);
  39. for (int i : src) {
  40. System.out.print(i);
  41. System.out.print(" ");
  42. }
  43. }
  44. }
        时间复杂度:
               最好的时间复杂度(正序):O(n) :(好像是改进过的)。
               最差的时间复杂度(反序):O(n^2):
                      比较次数:(n-1)+(n-2)+(n-3)+....+2+1 也就是O(n^2).
                      移动次数:3*比较次数,最坏的情况. 也就是O(n^2)。
  1. 10000
  2. name: 冒泡排序1 花费了 = 183ms
  3. name: 冒泡排序2 花费了 = 36ms
  4. name: 冒泡排序3 花费了 = 29ms
  5. name: 冒泡排序4 花费了 = 169ms
  6. name: 冒泡排序5 花费了 = 31ms
  7. 平均大概是89
  8. 50000
  9. name: 冒泡排序1 花费了 = 5090ms
  10. name: 冒泡排序2 花费了 = 833ms
  11. name: 冒泡排序3 花费了 = 757ms
  12. name: 冒泡排序4 花费了 = 5125ms
  13. name: 冒泡排序5 花费了 = 744ms
  14. 平均 2509
  15. 100000
  16. name: 冒泡排序1 花费了 = 20694ms
  17. name: 冒泡排序2 花费了 = 3338ms
  18. name: 冒泡排序3 花费了 = 3120ms
  19. name: 冒泡排序4 花费了 = 20862ms
  20. name: 冒泡排序5 花费了 = 3103ms
  21. 平均:10223
       可以看出来和选择排序排序哪一张对比(在相同条件下做出的测试):
               1、平均时间都比选择排序用时要长,这是由于冒泡排序交换的次数远比选择排序多,而比较次数则一样。
               2、冒泡排序的时间波动相对来说比较大,和随机数组的原本排序有关。如果原本顺序比较好,那么冒泡排序就
                    不需要太多的交换,那么速度会快很多。而相对插入排序,每次都的遍历完所有的未排序的序列,所以时间
                    也是相对很稳定的。

        稳定性:稳定。
            如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过
      前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳
      定排序算法。
0 0