一:冒泡排序的定义及其理解
冒泡排序是一种交换排序,它的基本思路是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
冒泡排序其实很容易理解,顾名思义,我们会想到气泡。就像水底下的鱼儿嘴巴里吐出的气泡,越邻近水平面上的气泡是越大的。那如何用冒泡排序的方法对大小不一的气泡进行排序呢?
冒泡排序图解如下:
待排序记录:67 23 23 29 10 41
第1趟比较过程
第一次比较:23 67 23 29 10 41
第二次比较:23 23 67 29 10 41
第三次比较:23 23 29 67 10 41
第四次比较:23 23 29 10 67 41
第五次比较:23 23 29 10 41 67
第2趟:23 29 10 34 41 67
第3趟:23 10 29 34 41 67
第4趟:10 23 29 34 41 67
二:算法思路:
1:判断排序记录是否为空或排序记录中是否只有一个元素,如果是则返回该排序记录。
2:比较相邻的记录,如果第一个是否比第二个大,如果是则交换,不是则不交换,继续比较第二个与第三个想念的记录。如此循环直到比较到最后一个记录。这样排序下来最后一个记录必然是整个排序记录是的最大值。
3:除去上一趟排序过程中得到的最后一位最大值。对前面的记录循环操作第2步。相应每趟序下来我们都可以得出此排序记录中的最大值并将其交换到排序记录的最后一个记录。
三:算法实现:
public class Code_BubbleSort {
public static void bubbleSort(int[] arr){
if(arr==null||arr.length<2){
return;
}
for(int e=arr.length-1;e>0;e--){
for(int i=0;i<e;i++){
if(arr[i]>arr[i+1]){
swap(arr,i,i+1);
}
}
}
}
public static void swap(int[] arr,int i,int j){
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
public static void printArray(int[] arr){
if(arr==null){
return;
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
int[] arr={5,8,1,7,0,2,5,9,4,3};
printArray(arr);
bubbleSort(arr);
printArray(arr);
}
}
四:时间空间复杂度和稳定性
1:时间复杂度:一个算法流程中,常数操作数量的指标,这个指标叫做O,big O.具体为,如是常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项系数之后,剩下的部分记 f(N),那么该算法的时间复杂度为O(f(N))。
常数操作相当于常数之间的寻址操作,与排序的常数量无关。冒泡排序中,假设有同个排序记录,第一趟排序是第一个记录与第二个记录相互比较,反序交换。第二个记录与第三个比较……..,直到第n-1位与第n位相互比较。总共比较次数为n次。依次类推,第二趟比较n-1次。第三趟比较n-3次…….最后一趟比较一次。将所有比较次数相加则为该算法流程中的常数操作数量的总数。n+(n-1)+(n-2)+(n-3)+……+1=[n(n+1)]/2.所以冒泡排序的时间复杂度为O(n^2)。
2:空间复杂度(额外空间复杂度):程序中只用到有限的变量来辅助完成排序。所以冒泡排序的额外空间复杂度为O(1).
3:稳定性:对一个排序记录进行排序。如是最终排序结果中相同的记录和原先未排序对比,其相对位置未发生变化。则此排序是稳定的。如上述冒泡排序图解。两个相同的23。未排序与排序完后,排序记录中第一个23与第二个23是永远不会交换位置的。所以冒泡排序是稳定的。
版权声明:本文为博主原创文章,未经博主允许不得转载