数据结构---冒泡排序优化算法

冒泡排序(Bubble Sort)

1、冒泡排序的思想:它重复地走访需要排序的数列,按照已经规定好的排序顺序,每一次比较相邻两个元素,如果他们的顺序错误就把他们交换过来。 直到没有再需要交换的元素,该数列就排序完成。

2、冒泡排序的算法运作(由小到大的排列顺序):

有一个数组a[10],用变量i表示它的下标(i从0开始)——

  1. 比较两个相邻元素a[i]和a[i+1],如果a[i]>a[i+1],就交换这两个数的位置;
  2. 重复执行第一步,直到比较到最后一对的时候(例:首次是a[8]和a[9],此 时,a[9]的值为该数组的最大值,这个值属于有序数列);
  3. 对所有元素(除了有序数列里的元素),重复执行第一步和第二步,每执行完一次,都会找到当前比较的数里最大的那个(有序数列就会增加一个);
  4. 随着参与比较的元素越来越少,最终没有任何一对元素需要比较的时候,排序完成。

3、传统的冒泡排序图示:

在下来我们看一下一般冒泡排序的算法:

int []a={3,2,4,6,7,5}              //定义一个长度为6的数组
for(int i=0;i<a.length;i++)            //外循环控制循环次数为数组的元素个数a.length
 for((int j=0;j<a.length-i-1;j++} //内循环控制需判断的次数,为数组的长度减去外层循环已的次数再减1
       if(a[j]>a[j+1])                //if判断是否进行交换,a[j]和a[j+1]进行判断
        {
            int temp=a[j];            //如果if判断成立,则进行两个元素交换
            a[j]=a[j+1];
            a[j+1]=temp;
        }                            

我们再讲一下冒泡排序优化的思想:

定义一个flag,用来判断有没有进行交换,如果在某次内层循环中没有交换操作,就说明此时数组已经是有序了的,不用再进行判断,这样可以节省时间。

 我们看一下优化后的代码书写:

​int flag=1;
int []a={3,2,4,6,7,5}              //定义一个长度为6的数组
for(int i=0;i<a.length&&flag;i++)           //外循环控制循环次数为数组的元素个数a.length和flag
{
flag=0;                                    // 每次外循环开始之前将flag置0;
 for((int j=0;j<a.length-i-1;j++} //内循环控制需判断的次数,为数组的长度减去外层循环已的次数再减1
       if(a[j]>a[j+1])                //if判断是否进行交换,a[j]和a[j+1]进行判断
        {
            int temp=a[j];            //如果if判断成立,则进行两个元素交换
            a[j]=a[j+1];
            a[j+1]=temp;
            flag=1;                    // 如果这次外循环有进行判断则将flag置1
        }                            
}
​

通过以上对比,我们明显可以看出相对于传统的冒泡排序算法这里有所优化 

性能分析:

时间复杂度:冒泡排序在平均和最坏情况下的时间复杂度都是O(n^2),最好情况下都是O(n);

空间复杂度:O(1);

稳定性:冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不必再去交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

猜你喜欢

转载自blog.csdn.net/weixin_42504145/article/details/82861055