排序
一、正宗的冒泡排序(Bubble Sort)
(1)定义
是一种交换排序,思想是:两两比较相邻记录的关键字,若反序则交换位置,直到没有反序的记录为止。
第一次大循环。
(2)代码
public static void bubbleSort(int[] arr){
int temp=0;
for(int i=0;i<arr.length - 1;i++) {
for (int j = 0; j < arr.length - 1-i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
(3)特点
- 一共进行arr.length - 1次大的循环(即外面的for循环)。每次循环的次数逐渐减少(即里面的for循环)。
- 冒泡排序的时间复杂度为O(n2)。
二、冒泡排序的优化
(1)正宗冒泡排序法的问题
对于正宗的冒泡排序法,若待排序的序列是{2,1,3,4,5,6},则除了2和1需要交换位置外,其他的for循环中的比较大小都是多余的。
(2)解决办法
在程序中添加标识变量flag,表示是否进行过位置的交换。
(3)代码
public static void bubbleSort(int[] arr){
int temp=0;
boolean flag = false; //标识变量,表示是否进行过交换
for(int i=0;i<arr.length - 1;i++) {
for (int j = 0; j < arr.length - 1-i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
if(flag == false){ //在内部for循环中,一次交换都没有发生过
break;
}else{
flag = false; //重置flag,进行下次判断
}
}
}