您的位置:首页 > 编程语言 > Java开发

【常用排序算法】冒泡排序与冒泡排序优化改进(Java实现)

2017-11-13 16:46 357 查看

冒泡排序:

public void sortIntegers(int[] A) {
for(int j=0;j<A.length-1;j++)
for(int i=0;i<A.length-1-j;i++){
if(A[i]>A[i+1]){
int temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
}
}
}


对相邻的元素进行两两比较,如果前者比后者大,就相互交换。

冒泡排序优化方案1

public void sortIntegers(int[] A) {
for(int j=0;j<A.length-1;j++){
Boolean state=true;
for(int i=0;i<A.length-1-j;i++){
if(A[i]>A[i+1]){
int temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
state=false;
}
}
if(state){
break;
}
}
}


加入状态位state,当内部for循环里的 if(A[i]>A[i+1]) 一次也没有满足时,说明已经是有序的序列。

冒泡排序优化方案2:

pu
4000
blic void sortIntegers(int[] A) {
int size=A.length-1,k=0;
for(int j=0;j<A.length-1;j++){
Boolean state=true;
for(int i=0;i<size;i++){
if(A[i]>A[i+1]){
int temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
k=i;
state=false;
}
}
size=k;
if(state){
break;
}
}
}


在优化方案1的基础上,对内部for循环继续优化,找出并记录 满足条件(if(A[i]>A[i+1]))最大值i,此处的“i”相当于一条分界线,序号在“i”之后的序列已经处于有序。

下一趟内部循环时的满足条件就为:i<上一步的最大值‘i’;为什么这里不需要用 <= 呢,也是因为if(A[i]>A[i+1])这个筛选条件。

冒泡排序优化方案3:鸡尾酒排序/定向冒泡排序

public void sortIntegers(int[] A) {
int left=0;
int right=A.length-1;
while(left<right){
//找出最大的一个并放置在当前尾部
for(int i=left;i<=right-1;i++){
if(A[i]>A[i+1]){
int temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
}
}
right--;
//找出最小的一个并放置在当前首部
for(int i=right;i>=left+1;i--){
if(A[i]<A[i-1]){
int temp=A[i];
A[i]=A[i-1];
A[i-1]=temp;
}
}
left++;
}
}


此处是从低到高然后从高到低,冒泡排序则是从低到高

如果您有更好的解法,欢迎您在留言区补充,感谢!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐