冒泡排序(Bubble Sort):
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
举个简单的例子:
小的在前,大的在后。
6 9 5 3
第一次从第一个开始比较,比较第一个和第二个的大小,如果后面的小就交换位置。然后比较第二个和第三个,以此类推。
第一次比较n-1次
第一次比较后:6 5 2 9
在比较一次后,会把最大的数字沉到底部。
然后进行第二次比较,这一次只用比较两次。
第二次比较n-2次
第二次:5 2 6 9
第三次比较n-3次
第三次:2 5 6 9
当在一次的比较过程中,如果没有发生元素的换位,则可以认为已经排序好了。
public static void bubbleSort(int[] arr){
int temp;
//这个标志位用来判断,是否发生了换位
boolean flag = false;
for (int j = 1;j<arr.length;j++) {//控制比较的次数
for (int i = 0; i < arr.length - j; i++) {//在当前的比较中比较几次
if (arr[i] > arr[i + 1]) {
flag = true;
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
if (!flag){
break;
}else{
flag = false;
}
// System.out.println("第"+j+"次"+Arrays.toString(arr));
}
System.out.println("最终排序"+Arrays.toString(arr));
}
完整测试代码
package sort.bubble;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;
public class BubbleSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要比较的数的个数");
int max = sc.nextInt();
int[] arr = new int[max];
for (int i =0 ;i<arr.length;i++){
arr[i]=(int)(Math.random()*100);
}
System.out.println("排序前"+Arrays.toString(arr));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println("排序后时间: "+simpleDateFormat.format(new Date()));
bubbleSort(arr);
System.out.println("排序后"+Arrays.toString(arr));
System.out.println("排序后时间: "+simpleDateFormat.format(new Date()));
}
public static void bubbleSort(int[] arr){
int temp;
boolean flag = false;
for (int j = 1;j<arr.length;j++) {
for (int i = 0; i < arr.length - j; i++) {
if (arr[i] > arr[i + 1]) {
flag = true;
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
if (!flag){
break;
}else{
flag = false;
}
// System.out.println("第"+j+"次"+Arrays.toString(arr));
}
System.out.println("最终排序"+Arrays.toString(arr));
}
}