冒泡排序
思路
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
原始数据:
第一轮交换
本轮共进行 4 次交换,也就是 (数据的个数-1) 次
第一次交换:
由于3比6小,所以本轮没有交换。
第二次交换:
由于6比4大,所以将 6 和 4 交换位置
第三次交换:
由于6比1大,所以将 6 和 1 交换位置
第四次交换:
由于6比2大, 所以将 6 和 2 交换位置
第二轮交换
由于最后一个数已经是最大值,所以不需要比较第4个数字和第5个数字
本轮共进行 3 次交换,也就是 (数据的个数-2)
第一次交换:
由于3比4小,所以没有发生交换
第二次交换:
由于4比1大,所以互相交换位置
第三次交换:
交换4和2的位置
第三轮交换
第四,第五个数已经排好序了
本轮共进行2次交换,也就是(数据的个数-3)
第一次交换:
交换 1 和 3 的位置
第二次交换:
交换 2 和 3 的位置
第四轮交换
第3个,第4个,第5个数据已经排好序了.
本轮共进行1次交换,也就是(数据个数-1)次
第一次交换:
无需交换
交换结果
到这里原始数据已经排好序了,共进行了 4 轮交换,也就是(数据的个数-1)轮
编码
第一轮排序代码:
public class bubbleSort {
public static void main(String[] args) {
int[] value = {3,6,4,1,2};
new bubbleSort().sort(value);
System.out.println("第一次排序");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
for (int i = 0; i < value.length - 1; i++) {
int temp;
if (value[i] > value[i+1]){
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
}
}
第二轮排序代码:
这里我们只需要把循环体中的 停止的条件变为 (value.length - 2)即可
public class bubbleSort {
public static void main(String[] args) {
int[] value = {3,4,1,2,6};
new bubbleSort().sort(value);
System.out.println("第二次排序");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
for (int i = 0; i < value.length - 2; i++) {
int temp;
if (value[i] > value[i+1]){
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
}
}
第三轮排序代码:
这里我们只需要把循环体中的 停止的条件变为 (value.length - 3)即可
public class bubbleSort {
public static void main(String[] args) {
int[] value = {3,1,2,4,6};
new bubbleSort().sort(value);
System.out.println("第三次排序");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
for (int i = 0; i < value.length - 3; i++) {
int temp;
if (value[i] > value[i+1]){
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
}
}
第四轮交换代码:
这里我们只需要把循环体中的 停止的条件变为 (value.length - 4)即可
public class bubbleSort {
public static void main(String[] args) {
int[] value = {1,2,3,4,6};
new bubbleSort().sort(value);
System.out.println("第四次排序");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
for (int i = 0; i < value.length - 4; i++) {
int temp;
if (value[i] > value[i+1]){
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
}
}
到这里,我们已经发现了规律
我们只需要用一个外层循环去控制轮次即可
public class bubbleSort {
public static void main(String[] args) {
int[] value = {3,6,4,1,2};
new bubbleSort().sort(value);
System.out.println("最终结果");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
//外层循环控制进行轮次
for (int j =1; j < value.length; j++){
//内层循环控制交换次数
for (int i = 0; i < value.length - j; i++) {
int temp;
if (value[i] > value[i+1]){
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
System.out.println("第" + j + "次排序");
for (int i : value) {
System.out.print(i + ",");
}
System.out.println();
}
}
}
思考
如果一开始提供的数据就已经是排好序的数据,我们就不需要进行排序
public class bubbleSort {
public static void main(String[] args) {
int[] value = {1,2,3,4,5,6,7,8};
new bubbleSort().sort(value);
System.out.println("最终结果");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
for (int j =1; j < value.length; j++){
for (int i = 0; i < value.length - j; i++) {
int temp;
if (value[i] > value[i+1]){
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
System.out.println("第" + j + "次排序");
for (int i : value) {
System.out.print(i + ",");
}
System.out.println();
}
}
}
我们可以加一个变量统计在一轮交换中的交换次数, 。 (提示:在每一轮结束后,不要忘记初始化count)
public class bubbleSort {
public static void main(String[] args) {
int[] value = {1,2,3,4,5,6,7,8};
new bubbleSort().sort(value);
System.out.println("最终结果");
for (int i : value) {
System.out.print(i + ",");
}
}
public void sort(int[] value) {
for (int j =1; j < value.length; j++){
//统计
int count = 0;
for (int i = 0; i < value.length - j; i++) {
int temp;
if (value[i] > value[i+1]){
count = count + 1;
temp = value[i];
value[i] = value[i+1];
value[i+1] = temp;
}
}
System.out.println("第" + j + "次排序");
for (int i : value) {
System.out.print(i + ",");
}
System.out.println();
if (count == 0){
return;
}
count = 0;
}
}
}
我们把数据换为
int[] value = {2,3,1,3,5,6,7,8};
这里由于第2次有交换,而第3次没有交换,所以两次交换结果一致