오름차순 정수 정렬을 예로 들어, 양방향 버블 분류 과정에 대한 간략한 설명 : 먼저 최대 숫자를 앞뒤로 끝으로 이동 한 다음 가장 작은 숫자를 뒤에서 앞쪽에서 앞쪽으로 전면으로 이동시킵니다. 배열.이 과정은 첫 번째 라운드입니다. 양방향 버블 분류는 전통적인 버블 분류보다 약간 낫습니다. 배열의 양쪽 끝이 양방향 분류 중에 잘 정렬되기 때문에 배열의 중간 부분 만 처리하면 일회용, 즉 전통적인 버블 분류, 즉 전통적인 버블 분류 만 처리하면됩니다. 꼬리의 요소 만 정렬되며 각 처리 라운드는 처음부터 정렬 된 이전 요소로 처리해야합니다. 효율이 약간 향상되었지만, 기본 기본 분류 프로세스에 의해 결정되는 분류 효율을 크게 향상시킬 수는 없습니다. 이를 바탕으로 다음 코드가 개선되었습니다.
양방향 버블 분류 소스 코드 :
코드 사본은 다음과 같습니다.
패키지 com.zc.manythread;
java.util.random import;
/**
* 양방향 버블 정렬
* @author 나는
*
*/
공개 클래스 bbsort {
// 양방향 버블 알고리즘은 루프 정렬의 시간을 크게 줄입니다.
public int [] sort (int [] a)는 예외 {
int J;
int limit = a.length;
int st = -1;
while (st <limit) {
// ST와 한계는 할당되어야합니다. 그렇지 않으면 배열이 처음부터 주문되면
ST ++;
한계--;
부울 교체 = 거짓;
// 첫 번째 루프는 최대 값을 끝에 넣습니다.
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;
교환 = 참으로;
}
}
if (! 스왑) {
반환 a;
}또 다른 {
교환 = 거짓;
// 두 번째 루프는 처음에 최소값을 부여합니다.
for (j = 한계; --j> = st;) {
if (a [j]> a [j+1]) {
int t = a [j];
a [j] = a [j+1];
a [j+1] = t;
교환 = 참으로;
}
}
if (! 스왑) {
반환 a;
}
}
}
반환 a;
}
private static int [] createate (int count) {
/**
* 중복 배열이 없습니다
*/
int [] data = new int [count];
랜덤 rand = 새로운 랜덤 ();
부울 [] bool = 새로운 부울 [100];
int num = 0;
for (int i = 0; i <count; i ++) {
하다 {
// 생성 된 숫자가 동일하면 계속 루프
num = rand.nextint (100);
} while (bool [num]);
bool [num] = true;
/* list.add (num);* /// 목록 목록
데이터 [i] = num;
}
반환 데이터;
}
public static void main (String [] args) {
최종 int count = 10;
int [] data = createate (count);
for (int n : data) {
System.out.print (n+"/t");
}
System.out.println ();
BSROT BSROT = 새로운 BSROT (데이터);
노력하다 {
int [] a = bsrot.sort (data);
for (int n : a) {
System.out.print (n+"/t");
}
} catch (예외 e) {
// TODO 자동 생성 캐치 블록
e.printstacktrace ();
}
}
}
실행 결과 :