Bubble Sort
冒泡排序(Bubble Sort),是计算机的一种排序方法。
它的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。
算法
冒泡排序经过n-1趟子排序完成,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序),则交换两数。算法描述如下:
第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。
第二趟:仍从第一对数开始比较,小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
复杂度
冒泡排序的时间复杂度(n^2),虽然不及堆排序、快速排序(nlogn,底数为2),但是有两个优点。
- “编程复杂度”低,很容易写出代码;
- 具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。
注:一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。
实现
C版本
void
swap (int *data, const int i, const int j)
{
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
void
buble_sort (int *data, const int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = size - 1; j > i; j--)
{
if (data[j] < data[j - 1])
{
swap (data, j, j - 1);
}
}
}
}
Java版本
/**
* Bubble Sort
*
*/
public class BubbleSort {
public void sort(int[] data) {
for (int i = 0; i < data.length; i++) {
for (int j = data.length - 1; j > i; j--) {
if (data[j] < data[j - 1]) {
swap(data, j, j - 1);
}
}
}
}
private void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}