交换排序(冒泡排序)
方法:比较相邻的元素并交换,直到数组有序为止
特点:性能和插入排序相似
public static void sort(int[] arr) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j+1]<=arr[j]) {
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
}
}
//改进
public static void sort01(int[] arr) {
for(int i=0;i<arr.length;i++) {
//每次重置为false
boolean flag=false;
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j+1]<=arr[j]) {
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
flag=true;
}
}
//如果上一次扫描没有发生交换,说明已经全部有序
if(flag==false) {
break;
}
}
}
//通过第一次改进的思路,我们可以深入考虑是否可以将已经有序的范围确定在某个区间
public static void sort02(int[] arr) {
int flag=arr.length-1;
int lastPosTmp=arr.length-1;
for(int i=0;i<arr.length;i++) {
//每次重置为
flag=lastPosTmp;
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j+1]<=arr[j]) {
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
lastPosTmp=j;
}
}
//如果上一次扫描没有发生交换,说明已经全部有序
if(lastPosTmp==flag) {
break;
}
}
}