java冒泡排序从前往后排的_浅析java双向冒泡排序算法

本文介绍了Java中的双向冒泡排序算法,该算法在传统冒泡排序基础上进行改进,通过从前往后和从后往前两步操作,能更有效地排序数组。文中提供了详细的代码实现,并展示了生成随机无重复数组及排序后的结果。
摘要由CSDN通过智能技术生成

以整数升序排序为例来简单说明一下双向冒泡排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好序元素的前面一个元素。虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由冒泡排序的基本过程所决定了的。在此基础上改进了一下,下面的代码可以实现对奇数偶数分别排序

双向冒泡排序源代码:

package com.zc.manythread;

import java.util.Random;

/**

* 双向冒泡排序

* @author 偶my耶

*

*/

public class BBSort  {

//双向冒泡算法,极大的减少了循环排序的次数

public int[] sort(int[] a)throws Exception{

int j;

int limit=a.length;

int st=-1;

while(st

//必须要给st和limit赋值,否则若数组一开始就有序

st++;

limit--;

boolean swapped=false;

//第一次循环将最大的值放到末尾

for (j = st    ; j < limit; j++) {

if (a[j]>a[j+1]) {

int T=a[j];

a[j]=a[j+1];

a[j+1]=T;

swapped=true;

}

}

if (!swapped) {

return a;

}else {

swapped=false;

//第二次循环将最小的值放到了开头

for (j = limit; --j>=st;) {

if(a[j]>a[j+1]){

int T=a[j];

a[j]=a[j+1];

a[j+1]=T;

swapped=true;

}

}

if (!swapped) {

return a;

}

}

}

return a;

}

private static int[]  createDate(int count) {

/**

* 无重复数组

*/

int[] data=new int[count];

Random rand = new Random();

boolean[] bool = new boolean[100];

int num = 0;

for (int i = 0; i < count; i++) {

do {

// 如果产生的数相同继续循环

num = rand.nextInt(100);

} while (bool[num]);

bool[num] = true;

/*   list.add(num);*///list 列表

data[i]=num;

}

return data;

}

public static void main(String[] args) {

final int count=10;

int[] data=createDate(count);

for(int n : data){

System.out.print(n+"\t");

}

System.out.println();

BSrot bsrot=new BSrot(data);

try {

int[] a=bsrot.sort(data);

for(int n : a){

System.out.print(n+"\t");

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

运行结果:

896c7d876053017f717e042780baebd0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值