频繁的交换操作:一趟排序,多次交换运算;
基本操作:交换运算;
集合始终都是完整的。
一趟排序,通过与相邻元素交换操作,把最大值移到最右边的目标位置。
过程:下标0开始与相邻元素比较,大于相邻元素则交换,直到对比到最右边元素,一趟排序停止,目标位置下标减一,继续由下标0开始,目标位置下标为0,整个排序终止。
代码实现
public class BubblingSort {
public static void main(String[] arg) {
int[] ints = {5, 4, 3, 2, 1};
// bubblingSort(ints, ints.length - 1);
bubblingSort2(ints);
for (int i : ints) {
System.out.print(i + " ");
}
}
/**
* 递归方式实现冒泡排序
*
* @param ints
* @param target
* @return
*/
public static int[] bubblingSort(int[] ints, int target) {
if (target == 0) {
return ints;
}
/**一次冒泡把最大值移到最右边位置*/
for (int i = 0; i < target; i++) {
if (ints[i] > ints[i + 1]) {
int temp = ints[i + 1];
ints[i + 1] = ints[i];
ints[i] = temp;
}
}
bubblingSort(ints, --target);
return ints;
}
/**
* 不适用递归方式实现冒牌排序
*/
public static void bubblingSort2(int[] ints) {
int targetIndex = ints.length - 1;
while (targetIndex > 0) {
for (int i = 0; i < targetIndex; i++) {
if (ints[i] > ints[i + 1]) {
int temp = ints[i + 1];
ints[i + 1] = ints[i];
ints[i] = temp;
}
}
--targetIndex;
}
}
}
介绍完冒泡排序,讲解一下冒泡的时间复杂度冒泡排序的时间复杂度为O(n^2)
时间复杂度
计算方法1.一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。
冒泡排序的时间复杂度计算过程:
冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排列,第一次大循环从第一个数(5)开始到倒数第二个数(2)结束,比较过程:先比较5和4,4比5小,交换位置变成4 5 3 2 1;比较5和3,3比5小,交换位置变成4 3 5 2 1……最后比较5和1,1比5小,交换位置变成4 3 2 1 5。这时候共进行了4次比较交换运算,最后1个数变成了数列最大数。第二次大循环从第一个数(4)开始到倒数第三个数(2)结束。进行3次比较交换运算。……所以总的比较次数为 4 + 3 + 2 + 1 = 10次对于n位的数列则有比较次数为 (n-1) + (n-2) + ... + 1 = n (n - 1) / 2,这就得到了最大的比较次数而O(N^2)表示的是复杂度的数量级。举个例子来说,如果n = 10000,那么 n(n-1)/2 = (n^2 - n) / 2 = (100000000 - 10000) / 2,相对10^8来说,10000小的可以忽略不计了,所以总计算次数约为0.5 N^2。用O(N^2)就表示了其数量级(忽略前面系数0.5)。