算法原理:
S1:从待排序序列的起始位置开始,从前往后依次比较各个位置和其后一位置的大小并执行S2。
S2:如果当前位置的值大于其后一位置的值,就把他俩的值交换(完成一次全序列比较后,序列最后位置的值即此序列最大值,所以其不需要再参与冒泡)。
S3:将序列的最后位置从待排序序列中移除。若移除后的待排序序列不为空则继续执行S1,否则冒泡结束。
算法实现(Java):
基础实现:
public static void bubbleSort(int[] array) {
int len = array.length;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
}
优化:若某一趟排序中未进行一次交换,则排序结束
public static void bubbleSort(int[] array) {
int len = array.length;
boolean flag = true;
while (flag) {
flag = false;
for (int i = 0; i < len - 1; i++) {
if (array[i] > array[i + 1]) {
int temp = array[i + 1];
array[i + 1] = array[j];
array[i] = temp;
flag = true;
}
}
len--;
}
}
php
function bubbleSort($arr) {
$lenght = count($arr);
for ($i = 0; $i < $lenght; $i++) {
for ($j = $i; $j < $lenght; $j++) {
if ($arr[$i] < $arr[$j]) {
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
//优化
function bubbleSort1($arr) {
$lenght = count($arr);
for ($i = 0; $i < $lenght; $i++) {
$flag = false;
for ($j = $i; $j < $lenght; $j++) {
if ($arr[$i] < $arr[$j]) {
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
$flag = true;
}
}
if ($flag == false) {
break;
}
}
return $arr;
}
function bubbleSort(&$arr) {
$length = count($arr);
$flag = true;
while ($flag) {
$flag = false;
for ($i = 0; $i < $length - 1; $i++) {
// 正序
// if ($arr[$i] > $arr[$i + 1]) {
// 倒序
if ($arr[$i] < $arr[$i + 1]) {
$temp = $arr[$i + 1];
$arr[$i + 1] = $arr[$i];
$arr[$i] = $temp;
$flag = true;
}
}
//if ($flag == false) {
// break;
//}
$length--;
}
}