/ K! b- Y, |% z- ~2 c8 }/ c3 npublic class BubbleSort {2 p/ O2 ]5 v- K9 \ P# ]
public static void main(String[] args) {8 |% j5 q/ ` Q
int[] arr = {3,9,-1,10,-2}; * r; q l* D" z `) {1 ` //大致过程7 a+ S" H! e3 G" L8 x. q" E
//1、第一步就是第一轮排序得到最大值于最后2 S" N5 F0 V; V: \6 o( M2 a- M
// for (int i = 0; i < arr.length - ; i++) { - D+ y$ @8 u: G$ a8 M // //如果前面的数比后面的数大,则交换 3 y0 d; b, Y4 r( K/ A, F // if (arr > arr[i+1]) { 2 }* u, J! d2 ^5 H& D // temp = arr; : v, ?" p/ A4 a9 l7 F+ T // arr = arr[i + 1];7 @3 n. f7 Z/ P2 y( b* `5 G) I% q& y/ y
// arr[i + 1] = temp;+ ]4 }! g3 {( D; T5 c
// }+ T: C7 z5 ^ v# G
// } " E) H, Y. ]+ G( z //2、第二糖就是把倒数第二大的排到倒数第二位- E4 d# D' \! _8 r: ~1 G
// for (int i = 0; i < arr.length - 1 - 1; i++) {9 T, W4 m( \! Z* H
// //如果前面的数比后面的数大,则交换8 |/ u+ u, A8 a7 v0 o
// if (arr > arr[i+1]) { 4 [" y/ Z6 }' v: S0 {7 [' e2 A // temp = arr; ' n& `) `0 O8 W4 _4 v6 @ // arr = arr[i + 1]; " ^. P4 u, b* d; n' \3 ?5 }) D // arr[i + 1] = temp;; e$ y* @& u% l
// }$ O( G( i; X) R* V7 Y. i9 H
// } ' P4 L) R) E( e' Z7 a/ N //3、第三糖排序,以此内推2 c- x1 a; e# k% ] V2 k H
//for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {/ t. M: J0 J3 c0 e* `
// //如果前面的数比后面的数大,则交换3 H( P5 @1 }* Y/ [! h7 N6 Q
// if (arr > arr[i+1]) {2 v, z0 Q. O6 [1 J1 a6 `6 S
// temp = arr; ?' R' u: b3 v2 g( V) L6 c5 X+ x // arr = arr[i + 1];4 u& ^: D% D) j, u
// arr[i + 1] = temp; O! c/ D4 a o/ K# @# o- ? // } - v; |1 y9 v4 ]3 `1 o( i' b3 p- C. l // } ; r& |. m! B+ ?; b8 s) C# ~, @1 Y //4、第四次排序,以此内推 9 {; y+ u% B) ^ r //for (int i = 0; i < arr.length - 1 - 1 - 1 - 1 i++) { * `' A/ u- Y) b/ N$ A& l F // //如果前面的数比后面的数大,则交换 - u: h: U) ]1 K" S6 v // if (arr > arr[i+1]) { 7 {1 t7 d5 L0 ~7 X7 i3 f- c. L* a' _ // temp = arr; T6 b! x* Y$ V" M6 U
// arr = arr[i + 1];5 j1 N2 S; h' s6 C' ^. ]% z7 {
// arr[i + 1] = temp;" }+ d% e- c) L- [
// }2 Y2 Z1 U) P8 Z$ u' I
// } ; @, Z; l( Z5 L1 T0 I; r1 H /*int temp = 0;//零时变量,用来将最大的数值排在最后. ^9 V( N4 S: W
for (int i = 0; i < arr.length - 1; i++) { ! O8 |! s6 X& u8 t2 C+ q //如果前面的数比后面的数大,则交换- `9 b8 P& O3 B7 T5 H: g* I
if (arr > arr[i+1]) { 5 V$ s/ k( r5 X9 x temp = arr;/ I: {% R0 F, D V. `3 O
arr = arr[i + 1]; " R7 F) m8 c9 q arr[i + 1] = temp; ) @: J$ s# z( c% W( r* q$ G& k } 4 H& A' Y$ l6 X } ) J' U! w1 W$ @ b+ |! Z& N - \$ T a6 X# ?: I4 ?1 \) D" ^! H
for (int i = 0; i < arr.length - 1 - 1; i++) { 7 O6 n! x% l; Q/ t, B( a //如果前面的数比后面的数大,则交换4 i ] h/ p, d- Z9 q! r; h
if (arr > arr[i+1]) { 3 }/ |; k* U" C+ Q( Q. [ temp = arr;$ }3 o. {5 @& r0 K& }- W Z
arr = arr[i + 1];6 h8 g0 n! g! N
arr[i + 1] = temp; 0 C( I+ o3 o. l. ^2 g } : y. ~6 ]! [! P- T6 ?! u) ? } 3 e0 X9 w6 x! H% n/ e# ^' v |$ [( T: e4 E1 k. x2 }1 J" f
+ Y4 P) g- @3 Z" f+ K9 B for (int i = 0; i < arr.length - 1 - 1 - 1; i++) { , q% b7 J& W+ I3 h0 R //如果前面的数比后面的数大,则交换 $ k8 n9 u o# r+ c4 O if (arr > arr[i+1]) { . T/ ], ?" S4 x5 n temp = arr; $ B) {* J6 y m. D7 Q9 ~) G arr = arr[i + 1]; ' I/ x" C) O2 y" N: i arr[i + 1] = temp;5 L) i; R/ y9 V# L- j
}2 b7 p3 _3 `9 {7 V* O
}, T( ^' J3 e' G: D
0 m# Z+ f+ y. f: E7 \- a* `* d" C
7 g, d9 ?7 h8 R7 R/ q# _3 G1 p/ @ for (int i = 0; i < arr.length - 1 - 1 -1 - 1; i++) { 9 ]& b, L+ `" m //如果前面的数比后面的数大,则交换 - {" H$ @ ^4 [( B E* `+ L5 n5 u if (arr > arr[i+1]) {5 M' H( \/ e" m6 p0 `3 R
temp = arr;7 |2 k9 l+ q# X: K! _
arr = arr[i + 1];+ z4 Z. Z, s( t3 J1 V9 n
arr[i + 1] = temp; 5 V% |2 X: L# _ }2 Y- r, c& O* `
}*/ / Y% {1 R; l# [1 \# [4 P9 Y * u0 ?- u5 i9 }, T+ o 2 N; L5 }9 ^* ^6 I& M1 q System.out.println("hello " + Arrays.toString(arr)); 5 ~- y5 n" V+ Y w# r/ S# X //------------------------------------------------------------------------------------ 5 {. b: I: L- d# }3 g, }- c //根据上面的观察可以知道了撒,可以再用一套循环解决5 D Q: v- Q" T+ [6 |( B0 [2 d. K6 q
8 l, }4 |3 J& J- n8 t4 s$ x7 ~4 t+ p" f
# I y( r" C' ?- W2 B( ~; j 1 ~' C0 c9 S( l# i) C1 N/ a$ X0 J, |6 _$ f
% M) `- b' q* Q( W% T% d, C3 T //好好理解一下、由此可知,他的时间复杂度为O(n*n)! W' q* Q, ]+ f, s; t0 {
int temp = 0;* ^" o4 g7 D1 P/ y3 \" p' G7 v
$ P- I. C1 U2 t( Y, s; ~/ U
" u9 F: L" |. h+ p* z9 G/ A1 n8 H( H boolean flag = false;9 W! J4 K! ^4 B( O
for (int j = 0; j < arr.length - 1; j++) { 2 t B9 F5 j) u3 c for (int i = 0; i < arr.length - 1 - j; i++) {* I7 z$ b: r8 ^4 ?- d2 [
//如果前面的数比后面的数大,则交换 2 G B+ v2 ?/ Q# }8 S! F# N4 A if (arr > arr[i+1]) {5 I( O6 g( X* e0 b! Q
flag = true;//在这里把flag值为true ! [5 j$ c( D: E* f6 R) Q temp = arr; * y; c1 X, V! r5 t1 q5 s8 p arr = arr[i + 1];" q7 q0 i, ]4 t) }# ^) ]
arr[i + 1] = temp; 8 M0 O# S% Q* {0 M: D8 T$ ? }5 b! z3 f% p+ |2 F5 W9 J+ J+ N" p
} : h- J6 \! v! M0 F0 v //在内部循环的时候进行查询1 O# `0 z0 s% S, f7 [! I
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。 ' r# Q: w' W) e3 E4 b break;/ |9 l& v7 I6 u! }
} else {; b2 s5 g) G/ ~" P
flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续. Z$ O2 N/ f- \. t& N6 D9 Q6 a) U
}1 T. C7 I6 c1 _& ]) }# k
} & d$ w/ B0 T2 m i' G% A0 ]8 G- Q8 O8 @$ S
5 k. v2 K, h' l5 T System.out.println("world " + Arrays.toString(arr));7 o$ _- G, y# c+ u3 T
} ( }+ a& C n& O' M8 D' y}* X: o' ?! V8 Y; G( p O 四、将上面的代码封装为一个方法 : m2 ?) G9 V' @, u& S) Mpublic class BubbleSort { , w) i! e. x" g6 S% o4 I- k public static void main(String[] args) {; T2 M& \ i X3 W& g
int[] arr = {3,9,-1,10,-2};* K a" @5 G, u& [8 M$ l
% ]( i5 I" K, V6 F- ?' y4 I5 L0 r7 D! X Y* f4 ]
bubbleSort(arr); 6 W7 ]$ k! [+ O3 O System.out.println("world " + Arrays.toString(arr));; L, x# B$ W& n+ A& Z3 @* i
} 6 I6 c2 E3 `" A# F4 [! @& b; f7 S" L, i! ^ k
7 T# m5 J! U: C+ u
public static void bubbleSort(int[] arr) { , b1 f, k( x+ O- G3 }8 { //好好理解一下、由此可知,他的时间复杂度为O(n*n) 5 f- F% Z2 x2 c1 h1 b! |% m int temp = 0; - Y+ x( j0 Q) ]5 z/ ~7 H) `; X3 t ' f( A' G9 p2 H( i/ k. X! ~ u" L/ k. L9 ?6 G5 d
boolean flag = false;8 C0 Q+ {. ?/ Q' k5 e/ a$ i
for (int j = 0; j < arr.length - 1; j++) {' ~' Q/ S7 J C- w& k z3 b
for (int i = 0; i < arr.length - 1 - j; i++) {% r- [6 J9 D; A1 a& @' y
//如果前面的数比后面的数大,则交换 3 Q& s- s0 H* n+ S- p if (arr > arr[i+1]) {$ \: w1 v9 w5 `7 Q+ ~4 f
flag = true;//在这里把flag值为true1 \2 U( j) }+ F: ^0 N+ q% |
temp = arr; $ c7 V M* @3 j& I; y arr = arr[i + 1];- H+ ?! } g/ e' i
arr[i + 1] = temp;3 ~) F; L( x4 {& } G/ g% p
} % w) G) ^" O( ~7 J V4 A }: p @7 G8 b, N6 r8 y# X0 ?
//在内部循环的时候进行查询+ l8 {* i* I/ u, f. a
if (!flag) {//说明在第一趟排序过程中一次交换都没有发生。 $ K% S- v: J; Z. s, t& F2 ^ break;) \7 f+ E6 _/ Z/ {
} else { # z/ P4 g0 A. H; W( x flag = false;//没有这个就是执行一遍就没了,要让他进行下次继续" ~! ]- G m! C- M: ?
} 0 o. \9 e3 U( F) v% z }6 b, T7 U. i* K4 \0 k
}# I# \8 q. I8 Y% }2 w5 a. O
} ' ?# Q% X% D8 X K8 a五、测试一下冒泡排序的时间复杂度
1、代码是实现
import java.text.SimpleDateFormat;( H/ g9 z# O4 O2 |7 `& U3 V/ Y
import java.util.Arrays;0 h1 K* [+ n1 M" f" M' w# ]' r
import java.util.Date; 6 }. K/ e5 y2 N5 e* q . i' ^; b$ {, {# _8 k! ?; g3 n4 ` * l8 y& s1 u7 T% Y! p$ Hpublic class BubbleSort {- ?1 s) d6 i1 e5 }7 }1 t
public static void main(String[] args) { + [9 e6 N1 m( | J1 n+ j( Z //1、创建80000个数据来测试一下我们的性能 / O% t6 e7 H, x4 S( ^- B int[] arr = new int[80000];3 Y% O3 l6 n0 H
for (int i = 0; i < 80000; i++) { ) L2 x6 V+ |& R' L6 ]% Y+ d arr = (int)(Math.random()*80000);//生成0到80000的数* Y$ R+ n F) c/ d' s4 V, M( U8 O
} / O7 v L- E1 n( m //2、输出时间 q7 T2 Z* J/ l9 [1 f$ x$ J Date date1 = new Date();% f/ s D! v" _8 j
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//格式化/ i) y- n3 H) O8 n0 K1 x O
String date1Str = simpleDateFormat.format(date1);' U+ r( ~: Z( k
System.out.println("排序前的时间" + date1Str);. u) B0 }: {4 ]2 C' {5 s
bubbleSort(arr);0 E% B/ s) i0 B1 v0 y1 C, }
Date date2 = new Date();5 E ]# P0 W B, t
String date2Str = simpleDateFormat.format(date2);* L8 |3 ~0 l' s, d8 ` b( K9 B
System.out.println("排序后的时间" + date2Str); % F+ `- v5 f9 \3 j6 S , L0 n {# v! N2 z" T, B: c c- Y) A! y6 a