버블 정렬 :
인덱스에 따라 인접한 두 가지 요소를 연속적으로 비교하는 것입니다. 그들이 (오름차순 또는 내림차순을 정렬 해야하는지에 따라)보다 크거나 작 으면 교체됩니다. 그렇지 않으면, 이런 식으로 변화가 없을 것입니다. N-1 회 비교 한 후, N은 요소 수와 동일합니다. N-2, N-3 ... 마지막 라운드까지 한 번 비교되므로 비교 수가 감소합니다. N-1에서 1까지
그런 다음 총 비교 수는 1+2+3+...+(n-1), 산술 공식으로 계산됩니다 : (1+n-1)/2*(n-1) ==> n/2*(n-1) ==> (n^2-n)*0.5
알고리즘의 시간 복잡성은 큰 o : o (n^2)로 표현되고, 계수 0.5 및 상수 -n은 무시됩니다.
Public Class Bubblesort {public static void main (String [] args) {int len = 10; int [] ary = new int [len]; 랜덤 random = new random (); for (int j = 0; j <len; j ++) {ary [j] = random.nextint (1000); } system.out.println ( "-----------------"); for (int j = 0; j <ary.length; j ++) {system.out.print (ary [j]+""); }/** Ascending Order, ASC1 및 ASC2는 내부 루프의 비교 수를 최적화합니다. // OrderASC2 (ary); OrderASC1 (ary); // 순서 하강 순서, 판단 크기를 바꾸면} 정적 무효 OrderASC (int [] ary) {int count = 0; // 비교 수 int len = ary.length; (int j = 0; 변수 값 * a = a+b * b = ab * a = ab */} count ++; }}} system.out.println ( "/n ------ 오름차순으로 정렬 한 후 OrderASC ------- 횟수 :" + count); for (int j = 0; j <len; j ++) {system.out.print (ary [j]+""); }} static void orderasc1 (int [] ary) {int count = 0; // 비교 수 int len = ary.length; 의 경우 (int j = 0; 0; // 1 단계 교환} count ++; } } System.out.println("/n------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (int j = 0; j < len; j++) { System.out.print (ary [j] + ""} 정적 void orderasc2 (int count = 0; // int j = len-1; j> 0; = 0; k <j) {// 내부 층에서 더 적은 비교 (ary [k + 1]) {ary [k + 1] = ary [k]) * 0; Order ------ 횟수 : " + count); for (int j = 0; j <len; j ++) {System.out.print (ary [j] +" ");}}}}인쇄
-------Before sorting------ 898 7 862 286 879 660 433 724 316 737 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
양방향 버블 정렬
Bubble Sorting_cocktail 분류는 양방향 버블 분류입니다.
이 알고리즘과 버블 분류의 차이점은 정렬 할 때 시퀀스의 두 방향으로 정렬되며 외부 층은 왼쪽과 오른쪽 경계 L <r을 비교한다는 것입니다.
내부 층의 사이클은 왼쪽에서 오른쪽으로 비례하며, 높은 값은 다음에 설정됩니다. 사이클은 오른쪽에서 왼쪽에서 왼쪽에 기반을두고 있으며 낮은 값은 이전에 설정됩니다.
효율성 측면에서 O (n^2)는 평범한 거품보다 빠르지 않습니다.
public class bubble_cocktailsort {public static void main (String [] args) {int len = 10; int [] ary = new int [len]; 랜덤 random = new random (); for (int j = 0; j <len; j ++) {ary [j] = random.nextint (1000); }/** 최소 교환 수는 1 시간이고 최대 수는 (n^2-n)/2 배* // ary = new int [] {10,9,8,7,6,5,4,3,2,1}; // 교환 수를 테스트 // ary = new int [] {1,2,3,4,5,6,7,8,10,9}; // test exchanges system.out.println ( "----------------------------"; for (int j = 0; j <ary.length; j ++) {system.out.print (ary [j]+""); } orderasc1 (ary); // OrderASC2 (ary); // 순서에 따라 판단 크기를 바꾸면} 정적 무효 OrderASC1 (int [] ary) {int compareCount = 0; // 비교 시간 int changecount = 0; // 교환 수 int len = ary.length; int left = 0, 오른쪽 = len -1, tl, tr; while (왼쪽 <오른쪽) {// 외부 층의 고정 사이클 수 = 왼쪽 + 1; tr = 오른쪽 -1; 의 경우 (int k = 왼쪽; k <오른쪽; k ++) {// 내부 레이어의 비교 수는 왼쪽에서 오른쪽으로 (ary [k]> ary [k + 1]) {// 전면이 뒷면보다 크고 [k] = ary [k + 1] + (ary [ary [k]) * 0; // changecount; tr = k; // k가 위치한 인덱스는 TR에 주어지고 TR은 후속 비교의 끝 인덱스 값을 나타냅니다. 왼쪽에서 오른쪽으로 비교 한 후 k는 왼쪽의 인덱스를 나타냅니다. } right = tr; 의 경우 (int k = 오른쪽; k> 왼쪽; k--) {// 내부 레이어의 비교 수는 오른쪽에서 왼쪽에서 왼쪽에서 왼쪽에서 왼쪽으로 줄어 듭니다. TL = K; // 라운드의 마지막 비교에서 k가 tl에 위치한 인덱스를 할당하고, tl은 후속 비교의 시작 인덱스 값을 나타냅니다. 오른쪽에서 왼쪽으로 비교 한 후 k는 오른쪽의 인덱스를 나타냅니다.} compareCount ++; } 왼쪽 = tl; } System.out.println("/n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- for (; l <r;) {// 왼쪽에서 오른쪽으로의 외부 고정 사이클의 수;/*/for (int k = l; k <r; k ++) ary [k+1] ++; 1]; ary [k -1] = temp -ary [k -1]; ary [k] = temp -ary [k -1]; changecount ++; TL = K; } 비교 ++; } l = tl; } system.out.println ( "/n ----- OrderASC2 오름차순으로 정렬 한 후 ------- 비교 수 :" + CompareCount + ", 교환 :" + changeCount); for (int j = 0; j <len; j ++) {system.out.print (ary [j]+""); }}}인쇄
--------Before sorting------ 783 173 53 955 697 839 201 899 680 677 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------