冒泡排序:
冒泡排序就是一种每次把array[n]和array[n+1]或array[n-1]两个元素比较,然后只保证相邻的两个元素的顺序,每次把最大的冒泡到最后
次数 | 排序结果 |
原始数据: | 10,6,1,9,3,8 |
第一次: | 6,1,9,3,8,10 |
第二次: | 1,6,3,8,9,10 |
第三次: | 1,3,6,8,9,10 |
public static int[] sort(int[] arr){
int temp;
int count=0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
count++;
if(arr[j]>arr[j+1]){
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
printArr(arr);
System.out.println();
}
System.out.println("总循环次数:"+count);
return arr;
}
public static void main(String[] args) {
int[] arr=new int[]{10,3,2,1,6,7,8,9};
sort(arr);
printArr(arr);
}
public static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
运行结果如下:
3,2,1,6,7,8,9,10,
2,1,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
总循环次数:28
1,2,3,6,7,8,9,10,
观察可知,在第二次排序后,其后三位均已有序,也就说以上述算法还是会把第三位当作无序来进行。故有如下优化:
public static int[] sort(int[] arr){
int temp;
int position=arr.length-1;
int count=0;
int offset;
for (int i = 0; i < arr.length; i++) {
offset=position;
for (int j = 0; j < offset; j++) {
count++;
if(arr[j]>arr[j+1]){
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
position=j;
}
}
printArr(arr);
System.out.println();
}
System.out.println("总循环次数:"+count);
return arr;
}
public static void main(String[] args) {
int[] arr=new int[]{10,3,2,1,6,7,8,9};
sort(arr);
printArr(arr);
}
运行结果如下:
3,2,1,6,7,8,9,10,
2,1,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
总循环次数:14
1,2,3,6,7,8,9,10,
通过循环次数可知,已经减少了比较次数,然而观察排序计划后,发现从第三次以后就已经是有序的,没有必要进行后续的操作,故又有以下优化:
public static int[] sort(int[] arr){
int temp;
int position=arr.length-1;
int count=0;
int offset;
for (int i = 0; i < arr.length; i++) {
offset=position;
for (int j = 0; j < offset; j++) {
count++;
if(arr[j]>arr[j+1]){
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
position=j;
}
}
printArr(arr);
System.out.println();
if(position==0){
break;
}
}
System.out.println("总循环次数:"+count);
return arr;
}
public static void main(String[] args) {
int[] arr=new int[]{10,3,2,1,6,7,8,9};
sort(arr);
printArr(arr);
}
运行结果如下:
3,2,1,6,7,8,9,10,
2,1,3,6,7,8,9,10,
1,2,3,6,7,8,9,10,
总循环次数:14
1,2,3,6,7,8,9,10,
以上是本次分享,有问题请私信或评论