淺析java雙向冒泡排序算法。本站提示廣大學習愛好者:(淺析java雙向冒泡排序算法)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析java雙向冒泡排序算法正文
以整數升序排序為例來簡略解釋一下雙向冒泡排序的進程:起首早年往後把最年夜數移到最初,然後反過去從後往前把最小的一個數挪動到數組最後面,這一進程就是第一輪,然後反復這一進程,終究就會把全部數組從小到年夜分列好。雙向冒泡排序要略微優於傳統的冒泡排序,由於雙向排序時數組的兩端都排序好了,我們只須要處置數組的中央部門便可,而單向即傳統的冒泡排序只要尾部的元素是排好序的,這時候每輪處置都須要從頭一向處置到曾經排好序元素的後面一個元素。固然它在效力上有了點改良,但它也不克不及年夜幅度進步其排序的效力,這是由冒泡排序的根本進程所決議了的。在此基本上改良了一下,上面的代碼可以完成對奇數偶數分離排序
雙向冒泡排序源代碼:
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();
}
}
}
運轉成果: