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