' X8 y4 X$ q: p1 i' s2 ]6 Z , D' x. L" F( v% b& O! D/ m # B! D& d6 s. A //好好理解一下、由此可知,他的时间复杂度为O(n*n) ' q/ d' m, ?+ u. a! s! b# M int temp = 0;# ^+ c h1 q% v% R4 k
# x! `( |7 M* e! S) J5 ^# r! A# f$ K! a
boolean flag = false; - ?8 y0 [1 l- h5 k; h for (int j = 0; j < arr.length - 1; j++) { ( Z* T. e4 N) X7 D for (int i = 0; i < arr.length - 1 - j; i++) {5 Q1 v' b$ K8 W0 o% D2 w
//如果前面的数比后面的数大,则交换 7 C5 z& J- w. ] if (arr > arr[i+1]) { ' X( t1 r" N4 e8 i( N" } flag = true;//在这里把flag值为true) t9 k7 Q+ g2 R2 n. [- F2 @
temp = arr;; ]( O9 a. O6 p
arr = arr[i + 1];! r8 K7 I# z1 A
arr[i + 1] = temp; " a) k) u: r. @; y: j# I- ]7 m } $ Y8 r7 Y3 x0 v3 D9 P" b( y1 W g } . g# k/ r4 x* ` //在内部循环的时候进行查询2 q+ g# x& T/ U# K6 p" W" P; x
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。 / |7 b/ n2 b$ X6 F break;" C1 L- `+ b" @/ X% D# o! Z
} else {0 c+ D$ K. i1 Z, g( a2 W
flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续) @' L W. n% N T" I
}8 d3 h5 o- f% ]5 \& `4 O
} . D# a, H% o( d Q2 P3 o" m: [3 l# v/ H/ t& ?2 l
2 j. j4 ^! U! J( V0 m3 x4 F System.out.println("world " + Arrays.toString(arr));& g2 b# J9 r- M0 {/ F
} 5 ]* A! F- W- ~} " n8 N) K1 g6 y e% u4 P# ~四、将上面的代码封装为一个方法 1 O! R& [: [2 c/ o/ Z2 Q9 c& bpublic class BubbleSort {: x L0 v* Y) y
public static void main(String[] args) {( F0 X3 Z" ?$ P9 X/ Z, w" b. E/ W
int[] arr = {3,9,-1,10,-2};8 \7 } t; K9 E
2 f8 |% }' d3 k* z- a! X1 a 0 G, F% ]+ j/ F5 S8 a8 t bubbleSort(arr);/ D3 M u/ ]* W% d3 ?( z
System.out.println("world " + Arrays.toString(arr));( b! F$ F. F: \9 a
}1 X# x0 ^( L& |4 d4 W% R5 ~/ ~
- m/ D, J" N. _5 R1 Q; _. w( }& o7 q: V/ P
public static void bubbleSort(int[] arr) { & Y! K4 j+ j( _! L; F% r //好好理解一下、由此可知,他的时间复杂度为O(n*n)) B& ]) a$ R0 n& Y2 F- j6 k& M2 I
int temp = 0; : o7 p6 K( u& X( x9 F . d) ?6 q( w5 t" y; w: m$ d/ _. Z& Q/ L% v7 P, ^! d1 R" D: X/ `
boolean flag = false; - D3 j% Y5 r0 q0 t8 n7 b: C for (int j = 0; j < arr.length - 1; j++) { 6 e6 Q: F1 {# [8 e for (int i = 0; i < arr.length - 1 - j; i++) {6 u" K- ^. |: I
//如果前面的数比后面的数大,则交换 8 P: f; y+ C3 O3 ]8 i+ Y ~+ C6 r if (arr > arr[i+1]) { K4 W. [$ x6 D a! q2 n( q
flag = true;//在这里把flag值为true " n, Y: Q( u6 l; t temp = arr;, w" E4 W/ v& o# o8 A5 ~* G
arr = arr[i + 1];0 G9 D" _ p$ e% u9 s1 K
arr[i + 1] = temp;) p8 x3 }! |$ Y+ |: ? O3 J
}4 ~& p; t: A* t5 } l
}" }+ y. _6 v/ Q& ]/ z3 B# u
//在内部循环的时候进行查询 ! i3 ?1 p! @9 _! H1 f+ Q" a if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。 3 P6 c* ~( w4 `& g break;: n* W& V' R5 e: [5 K. ^$ u2 x
} else { 8 E9 q' o6 m+ b9 s N: Q flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续 . \. W: U& \# z3 H0 S" |7 S! W }3 \- m3 ^' I( w5 r% U7 n6 u
}/ I/ b1 _) R) X! Y( h- Y
}4 ]# v# X( ^4 g- l+ m
} 5 q# Z: A5 m% r( f' n& m) ?五、测试一下冒泡排序的时间复杂度
1、代码是实现
import java.text.SimpleDateFormat;9 Y# h) G8 {) t& @! I- o, B- v! l
import java.util.Arrays; * k6 M. Q# q b/ Simport java.util.Date; ) m4 F+ a# R/ h) v/ F8 O. z1 [$ E7 q0 I
9 K' f5 y8 g5 q- P
public class BubbleSort { + y; t: F/ C2 I- H W4 C public static void main(String[] args) {7 O+ E. z2 I2 q. o
//1、创建80000个数据来测试一下我们的性能 V( Z# Z! J- v; } int[] arr = new int[80000];* q) x. v! r' Y+ Y2 X, l" T4 z
for (int i = 0; i < 80000; i++) { / m4 k; L$ e* f, B7 q2 W4 k arr = (int)(Math.random()*80000);//生成0到80000的数 + m. w% E; \& P. o* ^8 U } + x# t* V# [& v8 g2 z1 Q //2、输出时间8 }. V& ^, w. j8 \
Date date1 = new Date();3 c- D! o/ y. G' V/ l
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//格式化2 ?* G! \+ `! D! r, b" e! G% Y
String date1Str = simpleDateFormat.format(date1); + G: ^9 o* r. _4 i System.out.println("排序前的时间" + date1Str);6 ?/ y% i0 s4 X7 ^
bubbleSort(arr); / A: c1 U2 R! s6 J x4 p/ M Date date2 = new Date(); j3 ^$ R5 }2 \
String date2Str = simpleDateFormat.format(date2);) u. Q6 G$ W% R9 q7 r* Y
System.out.println("排序后的时间" + date2Str); % N" K9 ^$ O1 ^6 S6 ` [6 V- ^+ F' V" c5 s
% C( X' C, U) O! G. f. n C5 M& M. T& A, v
9 W3 l3 t" i- l, z2 }1 N
}! g3 r' }" y5 C# c
7 ~$ g7 ?. B! _. j R. L/ R . b, g0 Q8 n( k- Q: ?2 k j public static void bubbleSort(int[] arr) {- n) V2 Y1 Q* o$ b# D! y% o$ h
//好好理解一下、由此可知,他的时间复杂度为O(n*n) 2 N+ R; S; B/ G int temp = 0;8 y+ A# S1 y& H9 z" }) j
4 S5 S" d& y8 t" @ 1 J. n, D! ]6 c z! D boolean flag = false;" X9 F& e Y- V% s" ^
for (int j = 0; j < arr.length - 1; j++) {8 C9 ^" z3 r% k4 Q
for (int i = 0; i < arr.length - 1 - j; i++) {7 I3 o& o, D b4 R9 ~& D' ]- u
//如果前面的数比后面的数大,则交换 0 I( ?3 ?* W! V7 _ if (arr > arr[i+1]) { 9 n" `6 f2 T" |6 F" `% } flag = true;//在这里把flag值为true- T0 R( f; W# A- K( y
temp = arr; & Y3 y1 K" J$ D arr = arr[i + 1];) t# g* a7 ?- S9 Z, `# ]
arr[i + 1] = temp; 0 e* m. t: i! x' }$ n } ) T _, V/ L* w( x/ t8 z } " Q- s/ m0 f2 J6 M% H* w" r$ i7 ? //在内部循环的时候进行查询% r; W7 d8 X1 E1 ?% E [
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。 4 Q$ N! F6 m# X7 l5 E, Q break;# | ~6 N0 F" T ~
} else { 3 B0 [3 D# i2 {- G2 C flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续 ( l7 X& I; q, k+ ` } ' v& p2 W0 v2 k" ~! `+ ?9 P } / S( g9 h6 _% ~/ Q- P }2 e+ }5 H' G$ s1 q4 ~0 b
} , o Q8 @ B& e e( a$ z$ l" B; m9 [+ K9 A) ^7 Q
) [, p0 {8 Z( |& H
' M( e$ {$ G% ? N R7 ]
2、效果* N* E: d. o5 g) \7 v6 F1 K