1.算法思路
/*
* N个数字比较N-1轮
* 每轮比较N-1-i
* 两两比较小靠前
* */
/* int[] ns={};
for(int i=0,n=ns.length;i<n-1;i++){
for(int k=0;k<n-1-i;k++){//比较n-1轮
if(ns[k]<ns[k+1]){//每轮比较n-1-i次
//交换
}
}
}*/
2.针对int类型的数组
import java.util.Arrays;
public class Demo15 {
public static void main(String[] args) {
//数组排序
int[] arr = {6, 3, 8, 2, 9, 7};
System.out.println("排序前:arr=" + Arrays.toString(arr));
//外层循环控制比较多少论?
for (int i = 0, len = arr.length; i < len - 1; i++) {
//内层循环控制本轮比较多少次?
for (int j = 0; j < len - 1 - i; j++) {
//相邻元素进行比较,如果前一个元素大于后一个元素
if (arr[j] > arr[j + 1]) {
//交换
arr[j] = arr[j]^arr[j + 1];
arr[j + 1] = arr[j]^arr[j + 1];
arr[j] = arr[j]^arr[j + 1];
}
}
System.out.println("排序中:arr=" + Arrays.toString(arr));
}
System.out.println("排序后:arr=" + Arrays.toString(arr));
}
}
实现结果:
可以看到后面几次的排序结果一样,怎末优化呢?如下:
import java.util.Arrays;
//优化后的冒泡排序
public class Demo015 {
public static void main(String[] args) {
//数组排序
int[] arr = {6, 3, 8, 2, 9, 7};
System.out.println("排序前:arr=" + Arrays.toString(arr));
//外层循环控制比较多少论?
for (int i = 0, len = arr.length; i < len - 1; i++) {
//内层循环控制本轮比较多少次?
//true代表默认认为”已经处于有序状态“;
boolean isSorted=true;
for (int j = 0; j < len - 1 - i; j++) {
//相邻元素进行比较,如果前一个元素大于后一个元素
if (arr[j] > arr[j + 1]) {
//交换
arr[j] = arr[j]^arr[j + 1];
arr[j + 1] = arr[j]^arr[j + 1];
arr[j] = arr[j]^arr[j + 1];
isSorted=false;
}
}
if (isSorted){
//已经处于有序状态,则退出循环
break;
}
System.out.println("排序中:arr=" + Arrays.toString(arr));
}
System.out.println("排序后:arr=" + Arrays.toString(arr));
}
/*
* N个数字比较N-1轮
* 每轮比较N-1-i
* 两两比较小靠前
* */
/* int[] ns={};
for(int i=0,n=ns.length;i<n-1;i++){
for(int k=0;k<n-1-i;k++){//比较n-1轮
if(ns[k]<ns[k+1]){//每轮比较n-1-i次
//交换
}
}
}*/
}
运行结果:
2.针对String类型的数组
//字符串的比较大小通过”a.compareTo(b)“方法进行
//a<b返回结果为:负数
//a>b返回结果为:正数
//a=b返回结果为:零
返回值为int类型的一个数
import java.util.Arrays;
//冒泡排序根据String的compareTo进行排序
public class Demo16 {
public static void main(String[] args) {
//联系人名单
String[] contactArray = {"Megatron", "s司马铁锤", "Laden", "angelababy", "b比尔盖饭",
"l林平之", "BIGBANG", "Adele Adkins", "m马云", "Gaddafi", "g郭德纲",
"m马伯庸", "Ma Tong Seok"};
//字符串的比较大小通过”a.compareTo(b)“方法进行
//a<b返回结果为:负数
//a>b返回结果为:正数
//a=b返回结果为:零
//int ret=contactArray[0].compareTo(contactArray[1]);
//System.out.println(ret); //-38 Megatron<s司马铁锤
for (int i = 0, len = contactArray.length; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
//compareToIgnoreCase忽略大小写
if (contactArray[j].compareToIgnoreCase(contactArray[j + 1]) > 0) {
String temp = contactArray[j];
contactArray[j] = contactArray[j + 1];
contactArray[j + 1] = temp;
}
}
}
System.out.println("contactArray =" + Arrays.toString(contactArray));
}
}
运行结果: