当前位置:   article > 正文

冒泡排序原理以及改进算法实现_下面是对冒泡排序的改进算法,将数组a[0..n-1]中的元素排列成从小到大有序的整

下面是对冒泡排序的改进算法,将数组a[0..n-1]中的元素排列成从小到大有序的整

1.算法的基本思想

        冒泡排序是交换排序的一种,我们可以把将待排序的数组Arrray[0...n-1]理解成一个圆柱,将数组中的每一个元素都看成是重量为Array[i]的气泡,其中Array[0]在最上面 ,Array[n]在最下面。排序时候根据轻气泡在上重气泡在下的原则,自上而下扫描数组Array,遇到违反原则的气泡,就使其向下“下沉”,知道所有的气泡都是轻气泡在上重气泡在下,算法结束。

2.算法流程

1)初始时Array[0...n-1]无序,对n个元素序列进行n-1趟扫描。

2)第一趟扫描,自上而下比较数组R相邻的两个气泡的重量。若发现轻者在下、重在上,则交换两个气泡位置。

3)第二趟扫描,“次重”的气泡就被送到Array[n-2]的位置上。

4)按照如上方法进行扫描,每趟的扫描次数都比上次少一次。直到进行n-1趟扫描,算法结束。

3.算法实现

下面给出冒泡排序算法的实现代码

  1. /*
  2. 函数功能:对无序序列进行基本的冒泡排序
  3. 函数参数:参数1,待排序的数组;参数2,待排序数组大小
  4. */
  5. void BubbleSort(int *Array,int n)
  6. {
  7. int temp,i,j;
  8. for(i=n-1;i<0;i++)
  9. for(j=0;j<i;j++)
  10. if(*(Array+j)>*(Array+j+1))
  11. {
  12. temp=*(Array+j);
  13. *(Array+j)=*(Array+j+1);
  14. *(Array+j+1)=temp;
  15. }
  16. }
  17. /*主程序*/
  18. void main()
  19. {
  20. int Array[8]={5,7,9,2,3,11,4};
  21. int i;
  22. printf("待排序数组为:\n");
  23. for(i=0;i<8;i++)
  24. pringf("%d ",*(Array+i));
  25. BubbleSort(Array,8);
  26. printf("\n冒泡排序后的数组为:\n");
  27. for(i=0;i<8;i++)
  28. printf("%d ",*(Array+i));
  29. }

4.冒泡排序的改进算法

        通过对简单冒牌排序算法的分析,我们不难得出这样一个结论:每一趟比较结束后,若发现从某一个位置r开始,不再记录交换,就说明从Array[r+1]到Array[n-1]已经排序好了,从而下一趟比较只要进行到位置r就可以了。若某一趟扫描中没有记录交换,则说明所有元素都已有序,算法可以结束了,而不是必须进行n-1趟扫描。基于这种思想,可以给出一种冒泡排序的改进算法。

冒泡排序改进算法1,主要是记录了最后一次发生交换发生的位置

  1. /*
  2. 函数功能:对无序序列进行基本的冒泡排序
  3. 函数参数:参数1,待排序的数组;参数2,待排序数组大小
  4. */
  5. #include<stdio.h>
  6. void BubbleSort(int* Array, int n)
  7. {
  8. int bound = n;
  9. int i, m;
  10. int temp;
  11. while (bound != 0)
  12. {
  13. for (i = 0;i < bound;i++)
  14. {
  15. if (*(Array + i) > *(Array + i + 1))
  16. {
  17. temp = *(Array + i);
  18. *(Array + i) = *(Array + i + 1);
  19. *(Array + i + 1) = temp;
  20. m = i;/*用m来记录最后一次发生交换的位置*/
  21. }
  22. }
  23. bound = m;
  24. }
  25. }
  26. /*主程序*/
  27. int main()
  28. {
  29. int Array[8] = { 5,7,9,2,3,11,4 };
  30. int i;
  31. printf("待排序数组为:\n");
  32. for (i = 0;i < 8;i++)
  33. printf("%d ", *(Array + i));
  34. BubbleSort(Array, 8);
  35. printf("\n冒泡排序后的数组为:\n");
  36. for (i = 0;i < 8;i++)
  37. {
  38. printf("%d ", *(Array + i));
  39. }
  40. }

冒泡排序改进算法2(双向起泡),该算法中下沉和上浮是交替的。

  1. /*
  2. 函数功能:对无序序列进行基本的冒泡排序
  3. 函数参数:参数1,待排序的数组;参数2,待排序数组大小
  4. */
  5. #include<stdio.h>
  6. void BubbleSort(int* Array, int n)
  7. {
  8. int boundmin = 0;
  9. int boundmax = n;
  10. int mmin,mmax,i;
  11. int temp;
  12. while (boundmin<boundmax)
  13. {
  14. mmin = 0;
  15. mmax = 0;
  16. for (i = boundmin;i < boundmax;i++)/*此次扫描使重气泡下沉*/
  17. {
  18. if (*(Array + i) > *(Array + i + 1))
  19. {
  20. temp = *(Array + i);
  21. *(Array + i) = *(Array + i + 1);
  22. *(Array + i + 1) = temp;
  23. mmax = i;/*用mmax来记录下沉最后一次发生交换的位置*/
  24. }
  25. }
  26. if (mmax == 0)/*本次扫描没有记录交换,扫描结束*/
  27. break;
  28. boundmax = mmax;
  29. for (i = boundmax-1;i < boundmin;i--)/*此次扫描使轻气泡上浮*/
  30. {
  31. if (*(Array + i) <*(Array + i - 1))
  32. {
  33. temp = *(Array + i);
  34. *(Array + i) = *(Array + i - 1);
  35. *(Array + i -1) = temp;
  36. mmin= i;/*用mmin来记录上升最后一次发生交换的位置*/
  37. }
  38. }
  39. if (mmin == 0)/*本次扫描没有记录交换,扫描结束*/
  40. break;
  41. boundmin = mmin;
  42. }
  43. }
  44. /*主程序*/
  45. int main()
  46. {
  47. int Array[8] = { 5,7,9,2,3,11,4,8 };
  48. int i;
  49. printf("待排序数组为:\n");
  50. for (i = 0;i < 8;i++)
  51. printf("%d ", *(Array + i));
  52. BubbleSort(Array, 8);
  53. printf("\n冒泡排序后的数组为:\n");
  54. for (i = 0;i < 8;i++)
  55. {
  56. printf("%d ", *(Array + i));
  57. }
  58. }

5.性能评价

时间复杂度:最好为O(n),最坏为O(n2),因此平均时间复杂度为O(n2)。

空间复杂度:冒泡排序是就地排序,空间复杂度为O(1)。

稳定性:由算法流程知,冒牌排序是稳定的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/824421
推荐阅读
相关标签
  

闽ICP备14008679号