冒泡排序

来源:互联网 发布:云服务器端口转发规则 编辑:程序博客网 时间:2024/06/15 06:53

冒泡排序其实挺简单,它的基本思想就是:每次比较两个相邻的元素,如果它们的顺序错误我们就把他们交换过来。
下面我举一个例子:我们需要把n个数的数组通过冒泡排序进行从大到小的排序,应该怎么做呢?很简单,核心算法代码如下:
for(int i=1;i<=n-1;i++)
for(int j=0;j<=n-1;j++)
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
第一个循环语句是冒泡的次数。为什么是n-1次呢?因为每次冒泡都会确定一个数的位置,那么经过n-1次之后,就确定了n-1 个数的位置了,那么最后一个数的位置也就确定了。
那么第二个循环语句就是每次比较两个相邻的元素,一直比到a[n-1]和a[n-1+1].其实这个循环还可以优化的,刚才我们说了,每次冒泡都会确定一个元素的位置,那么那个确定了位置的元素就不需要再参与冒泡了,这里最终是从大到小,那么就是说每次最后那几个数就不需要在参与冒泡环节了。因此,循环的判断语句就可以改为:j<=n-i;
最终这个代码可以写成如下形式:
for(int i=1;i<=n-1;i++)
for(int j=1;j<=n-i;j++)
if(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
}

冒泡排序的核心部分是双重嵌套循环,然而就是因为循环嵌套,导致了这个算法的时间复杂度难以让人接受,可以说“冒泡排序除了导致了某些有趣的理论问题之外,并没有什么值的推荐的”,冒泡排序的每一趟都只能确定将一个数归位,为了一个数的位置,循环遍历所有元素,这样是很不值得的。

0 0
原创粉丝点击