以整數(shù)升序排序?yàn)槔齺砗唵握f明一下雙向冒泡排序的過程:首先從前往后把最大數(shù)移到最后,然后反過來從后往前把最小的一個數(shù)移動到數(shù)組最前面,這一過程就是第一輪,然后重復(fù)這一過程,最終就會把整個數(shù)組從小到大排列好。雙向冒泡排序要稍微優(yōu)于傳統(tǒng)的冒泡排序,因?yàn)殡p向排序時數(shù)組的兩頭都排序好了,我們只需要處理數(shù)組的中間部分即可,而單向即傳統(tǒng)的冒泡排序只有尾部的元素是排好序的,這時每輪處理都需要從頭一直處理到已經(jīng)排好序元素的前面一個元素。雖然它在效率上有了點(diǎn)改進(jìn),但它也不能大幅度提高其排序的效率,這是由冒泡排序的基本過程所決定了的。在此基礎(chǔ)上改進(jìn)了一下,下面的代碼可以實(shí)現(xiàn)對奇數(shù)偶數(shù)分別排序
雙向冒泡排序源代碼:
package com.zc.manythread;
import java.util.Random;
/**
* 雙向冒泡排序
* @author 偶my耶
*
*/
public class BBSort {
//雙向冒泡算法,極大的減少了循環(huán)排序的次數(shù)
public int[] sort(int[] a)throws Exception{
int j;
int limit=a.length;
int st=-1;
while(st<limit){
//必須要給st和limit賦值,否則若數(shù)組一開始就有序
st++;
limit--;
boolean swapped=false;
//第一次循環(huán)將最大的值放到末尾
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;
//第二次循環(huán)將最小的值放到了開頭
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) {
/**
* 無重復(fù)數(shù)組
*/
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 {
// 如果產(chǎn)生的數(shù)相同繼續(xù)循環(huán)
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();
}
}
}
運(yùn)行結(jié)果: