经典排序算法 冒泡排序Bubble sort

 

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,

 

这样一趟过去后,最大或最小的数字被交换到了最后一位,

 

然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子

 

例子为从小到大排序,

 

原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |

 

 

 

第一趟排序(外循环)

 

第一次两两比较6 > 2交换(内循环)

 

交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |

 

交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |

 

 

 

第二次两两比较,6 > 4交换

 

交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |

 

交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |

 

 

 

第三次两两比较,6 > 1交换

 

交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |

 

交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |

 

 

 

第四次两两比较,6 > 5交换

 

交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |

 

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

 

 

第五次两两比较,6 < 9不交换

 

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

 

 

第二趟排序(外循环)

 

第一次两两比较2 < 4不交换

 

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

 

 

第二次两两比较,4 > 1交换

 

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 | 

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

 

 

第三次两两比较,4 < 5不交换

 

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 | 

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

 

 

第四次两两比较,5 < 6不交换

 

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

 

 

第三趟排序(外循环)

 

第一次两两比较2 > 1交换

 

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

 

 

第二次两两比较,2 < 4不交换

 

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

 

 

第三次两两比较,4 < 5不交换

 

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

 

 

第四趟排序(外循环)无交换

 

第五趟排序(外循环)无交换

 

 

 

排序完毕,输出最终结果1 2 4 5 6 9

 

我们把后边想像成水面,前边是水底,就是冒泡泡了

代码如下:

// 冒泡排序1

void BubbleSort1(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);

}

下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

void BubbleSort2(int a[], int n) {

int j, k;

boolean flag;

k = n;

flag = true;

while (flag) {

 

flag = false;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = true;

}

k--;

}

}

 

再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

// 冒泡排序3

void BubbleSort3(int a[], int n) {

int j, k;

int flag;

 

flag = n;

while (flag > 0) {

k = flag;

flag = 0;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = j;

}

}

}

完整代码如下:

publicclass SortTest {

 

publicstaticvoid main(String[] args) {

int[] a = { 6, 2, 4, 1, 5, 9 };

new SortTest().BubbleSort3(a, a.length);

}

// 冒泡排序3

void BubbleSort3(int a[], int n) {

int j, k;

int flag;

 

flag = n;

while (flag > 0) {

k = flag;

flag = 0;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = j;

}

}

}

// 冒泡排序2

void BubbleSort2(int a[], int n) {

int j, k;

boolean flag;

k = n;

flag = true;

while (flag) {

 

flag = false;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = true;

}

k--;

}

}

 

// 冒泡排序1

void BubbleSort1(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);

}

 

privatevoid Swap(int[] a, int j) {

int temp = a[j - 1];

a[j - 1] = a[j];

a[j] = temp;

 

for (int j2 = 0; j2 < a.length; j2++) {

System.out.print(a[j2] + "  ");

}

System.out.println();

 

}

}

 

转自:http://blog.csdn.net/morewindows/article/details/6657829