//冒泡排序 -- 简单版本
void bubble(int[] array){
if(array==null){
return;
}
if(array.length<=1){
return;
}
// 冒泡排序的本质就是:(如果排序结果为从小到大)不断将剩余最大的数 交换到 有序区域
// 例如: 0 5 3 7 6
// 第一次冒泡后, 变为 0 3 5 6 7
// 第二次变为: 0 3 5 6 7
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-1;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
}
}
}
}
//冒泡排序进阶版
// 注意到,每次排序后,都能使数组逐渐有序,很有可能不需要比较(n-1)*(n-1)就完成了目的
void buddle2(int []array){
if(array==null){
return;
}
if(array.length<=1){
return;
}
boolean is_again=false;
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-1;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
is_again=true;
}
}
if(!is_again){
return;
}
}
}
// 冒泡排序继续进化
// 注意到,每一次遍历之后 后面的那一块都是有序的,没必要再进行交换操作
void buddle3(int[] array){
if(array==null){
return;
}
if(array.length<=1){
return;
}
int cur_end=array.length-1;
int record=0;
boolean is_again=false;
for(int i=0;i<array.length-1;i++){
for(int j=0;j<cur_end;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
is_again=true;
record=j;
}
}
cur_end=record;
if(!is_again){
return;
}
}
}
// 现在,每次都只是将最大的给交换到最数组后面,但还可以在一轮中将最小的也放到前面
void buddle(int [] array){
if(array==null){
return;
}
if(array.length<=1){
return;
}
int cur_start=0;
int cur_end=array.length-1;
int record_start=0;
int record_end=0;
boolean is_again=false;
for(int i=0;i<array.length/2;i++){
for(int j=cur_start;j<cur_end;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
is_again=true;
record_end=j;
}
}
if(!is_again){
return;
}
is_again=fale;
cur_end=record_end;
for(int j=cur_end;j>cur_start;j--){
if(array[j]<array[j-1]){
swap(array,j,j+1);
is_again=true;
record_start=j;
}
}
cur_start=record_start;
if(!is_again){
return;
}
}
}
private void swap(int[] arr, int i, int j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
算法之关于冒泡排序的奋斗史
最新推荐文章于 2021-11-02 11:45:32 发布