【算法】冒泡排序

1.算法简介


冒泡排序(Bubble Sort)是一种简单的排序算法。一次比较相邻的两个元素,如果较大元素在后则需要交换。重复走访待排序的数列,直至没有交换发生为止。算法名字的由来:越小的元素会经由交换慢慢“浮”到数列的顶端,像冒泡一样。


冒泡排序是与插入排序拥有相同的时间复杂度O(n^2),但所需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n^2)次交换,而插入排序只要最多O(n)交换。冒泡排序的实现通常会对已经排序好的数列拙劣地执行(O(n^2)),而插入排序在这个例子只需要O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。


算法的步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
动态演示:


void bubble_sort(int a[],int n)
{
	int i,j;
	for(i=0;i<n;i++)
		for(j=1;j<n-i;j++)
			if(a[j-1]>a[j])
				swap(&a[j-1],&a[j]);
}

优化:如果使用一个标志来表示有无需要交换的可能,有可能把最好的复杂度降低到O(n)。

void bubble_sort(int a[],int n)
{
	int i,bound;
	int exchange=n-1;       //初始化
	while(exchange)
	{
		bound=exchange; //记录上一次的交换位置
		exchange=0;     //假定这一次没发生交换
		for(i=0;i<bound;i++)
			if(a[i]>a[i+1])
			{
				swap(&a[i],&a[i+1]);
				exchange=i;
			}
	}
}


2.Referrence


[1] 维基百科, 冒泡排序.
[2] kkun, 经典排序算法 - 冒泡排序Bubble sort.

3.问题


3.1 POJ 2388


问题描述:求中位数。

源代码:
2388 Accepted 188K 422MS C 565B 2014-03-06 15:00:16
#include "stdio.h"
#include "string.h"

#define MAX 10000

void swap(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}

void bubble_sort(int a[],int n)
{
	int i,bound;
	int exchange=n-1;
	while(exchange)
	{
		bound=exchange;
		exchange=0;
		for(i=0;i<bound;i++)
			if(a[i]>a[i+1])
			{
				swap(&a[i],&a[i+1]);
				exchange=i;
			}
	}
}

int main()
{
	int a[MAX],n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	bubble_sort(a,n);
    printf("%d\n",a[n/2]);
    return 0;
}




你可能感兴趣的:(【算法】冒泡排序)