1.冒泡排序
1-1:思路
冒泡排序的每一轮从杂乱无章的数组头部开始,每两个元素之间进行交换,直到这一轮当中最大或者最小的元素放在数组的尾部
然后去不断重复这个过程
ps:冒泡排序的核心在于双循环的编写,外层循环用来进行数组的遍历,内层循环用来进行数据的交换
1-2:举个栗子
假设存在数组{5,3,2,4,1},如何根据冒泡排序的特点写出算法呢?
一步一步来吧....
*先创建一个数组进行存放这些数据,加上简单遍历
int sortArr[]={5,3,2,4,1};
//show the array
System.out.println("原数组");
for (int i : sortArr) {
System.out.print(i + " ");
}
*进行第一轮的交换
//该方法用来进行两个数之间的交换
public static void swap(int[] arr, int i, int j) {
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void bubbingFirstSort(int []arr){
for (int j = 0; j < arr.length - 1 ; j++) {
//将前一个数和后一个进行比较
if (arr[j] > arr[j + 1]) {
//进行两个数的交换
swap(arr, j, j + 1);
}
}
System.out.println("第1次循环");
System.out.println(Arrays.toString(arr));
}
*进行第二轮的交换
public static void bubbingFirstSort(int []arr){
//由于已经把最大的数放在最后了 所以只需要比较 arr.length-2次即可
for (int j = 0; j < arr.length - 1-1 ; j++) {
//将前一个数和后一个进行比较
if (arr[j] > arr[j + 1]) {
//进行两个数的交换
swap(arr, j, j + 1);
}
}
System.out.println("第2次循环");
System.out.println(Arrays.toString(arr));
}
*进行n次循环
for (int j = 0; j < array.length - 1 - (n-1); j++) {
if (array[j] > array[j + 1]) {
flag=true;
//进行两个数的交换
swap(array, j, j + 1);
}
}
System.out.println("第"+(i+1)+"次循环");
System.out.println(Arrays.toString(array));
*...总结以上规律可以发现一些规律,从而套上外循环可得(注:在这里做了一些小优化,如果发现在一次循环中不去调用内层循环,说明算法已经结束了 flag=false;)
public static void bubbingFinalSort(int[] array) {
int temp = 0;
boolean flag = false;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
flag=true;
//进行两个数的交换
swap(array, j, j + 1);
}
}
System.out.println("第"+(i+1)+"次循环");
System.out.println(Arrays.toString(array));
if(!flag){
//说明在一趟排序中一次交换都没有发生过
break;
}else{
//重置 flag进行下一次判断
flag=false;
}
}
}
*结果