这玩意学了好久了还是不会。。。。。。
看不懂就去搜一些动图来看吧,毕竟这玩意还是动起来容易理解一点。
https://www.cnblogs.com/onepixel/articles/7674659.html
public static <E extends Comparable<E>> void sort(E[] data){
for (int i=0;i<data.length;i++){
//data[n-i,n)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
//通过冒泡在data[n-i-1)位置放上合适的元素(j变量不断从数组开头索引对比交换)
for (int j=0;j<data.length-i-1;j++){
if (data[j].compareTo(data[j+1])>0){
swap(data,j,j+1);
}
}
}
}
//优化1
public static <E extends Comparable<E>> void sort2(E[] data){
for (int i=0;i<data.length;i++){
//data[n-i,n)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
//通过冒泡在data[n-i-1)位置放上合适的元素(j变量不断从数组开头索引对比交换)
boolean isSwap=false;
for (int j=0;j<data.length-i-1;j++){
if (data[j].compareTo(data[j+1])>0){
swap(data,j,j+1);
isSwap=true;//判断data中元素是否全部已排好序,如果全部排好序就不会进来了
}
}
//isSwap==false;证明data已全部排好序,不用再循环判断了
if (!isSwap)break;
}
}
//优化2
public static <E extends Comparable<E>> void sort3(E[] data){
for (int i=0;i<data.length;){
//data[n-i,n)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
//通过冒泡在data[n-i-1)位置放上合适的元素(j变量不断从数组开头索引对比交换)
int lastSwapIndex=0;//最后一次交换的位置,在这个变量之后的元素就已经排好序了
for (int j=0;j<data.length-i-1;j++){
if (data[j].compareTo(data[j+1])>0){
swap(data,j,j+1);
lastSwapIndex=j+1;
}
}
i= data.length-lastSwapIndex;//得出后面有多少元素已经排好序了
}
}
//换角度实现冒泡排序
public static <E extends Comparable<E>> void sort4(E[] data){
for (int i=0;i<data.length;i++){
//data[0,i)已排好序(第一层循环变量i表示的是后面已经有i个元素排好了)
//通过冒泡在data[j-1]位置放上合适的元素(j变量不断从数组结尾索引对比交换)
for (int j=data.length-1;j>i;j--){
if (data[j-1].compareTo(data[j])>0){
swap(data,j-1,j);
}
}
}
}
private static <E> void swap(E[] data,int j,int k){
E temp;
temp=data[j];
data[j]=data[k];
data[k]=temp;
}
public static void main(String[] args){
Integer[] data={6,8,3,9,2,4,0};
BubbleSort sort=new BubbleSort();
sort.sort(data);
//sort.sort2(data);
//sort.sort3(data);
for (int i=0;i<data.length;i++){
System.out.print(" "+data[i]);
}
System.out.println();
}