vlambda博客
学习文章列表

关于冒泡排序看这篇就够了!

简介

冒泡排序(bubble sort)是基于交换的排序,在执行过程序中元素一个一个往后移动,就好像水中气泡一个一个向上冒一样,由此而得名

冒泡排序


  
    
    
  
  1. void bobble_sort(int *array, int length)

  2. {

  3. for (int i = 0; i < length-1; ++i) {

  4. for (int j = 0; j < length - i - 1; ++j) {

  5. if (array[j] > array[j+1]) {

  6. int swap = array[j];

  7. array[j] = array[j+1];

  8. array[j+1] = swap;

  9. }

  10. }

  11. }

  12. }

冒泡排序V2

对于排序来说,如果元素已经是有序的情况完全可以结束排序


  
    
    
  
  1. void bobble_sort2(int *array, int length)

  2. {

  3. for (int i = 0; i < length-1; ++i) {

  4. bool isSorted = true;

  5. for (int j = 0; j < length - i - 1; ++j) {

  6. if (array[j] > array[j+1]) {

  7. int swap = array[j];

  8. array[j] = array[j+1];

  9. array[j+1] = swap;

  10. isSorted = false;

  11. }

  12. }


  13. if (isSorted) {

  14. break;

  15. }

  16. }

  17. }

冒泡排序V3

在对第一层循环优化的情况下,如果我们想要在提升算法性能就需要对第三层动手,这次引入sortBorder变量来标识需要排序的元素范围,从而跳过有序元素


  
    
    
  
  1. void bobble_sort3(int *array, int length)

  2. {

  3. int sortBorder = length - 1;

  4. for (int i = 0; i < length-1; ++i) {

  5. bool isSorted = true;

  6. int sortBorderTmp = 0;

  7. for (int j = 0; j < sortBorder; ++j) {

  8. if (array[j] > array[j+1]) {

  9. int swap = array[j];

  10. array[j] = array[j+1];

  11. array[j+1] = swap;

  12. isSorted = false;

  13. sortBorderTmp = j;

  14. }

  15. }

  16. sortBorder = sortBorderTmp;


  17. if (isSorted) {

  18. break;

  19. }

  20. }

  21. }

鸡尾酒排序


从复杂度来看鸡尾酒排序跟v3版本没什么区别,只是多了个好听的名字


  
    
    
  
  1. void cocktail_sort(int *array, int length)

  2. {

  3. int swap = 0;

  4. for (int i = 0; i < length / 2; ++i) {

  5. // 奇数轮

  6. bool isSorted = true;

  7. for (int j = i; j < length-1; ++j) {

  8. if (array[j] > array[j+1]) {

  9. swap = array[j];

  10. array[j] = array[j+1];

  11. array[j+1] = swap;

  12. isSorted = false;

  13. }

  14. }


  15. if (isSorted) {

  16. break;

  17. }


  18. // 偶数轮

  19. isSorted = true;

  20. for (int j = length-i-1; j > i; j--) {

  21. if (array[j]<array[j-1]) {

  22. swap = array[j];

  23. array[j-1] = array[j];

  24. array[j] = swap;

  25. isSorted = false;

  26. }

  27. }

  28. if (isSorted) {

  29. break;

  30. }

  31. }

  32. }

源码地址