冒泡排序(JAVA)
冒泡排序算法的原理如下: [1]
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序是一种非常经典的算法,易于理解而且容易实现。
复杂度:
- 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数和记录移动次数均达到最小值(代码中对应move_step=0和coms_tep=n-1次)
- 若文件是逆序的,
时间复杂度:最差:O(N^2) 最好:O(N)
冒泡排序是稳定排序算法
代码:
使用了单例模式,方便在程序内部比较不同算法的移动/比较次数,不需要的删掉就可以
代码中in_order(List list, boolean flag)方法中的list为一个ArryList,flag=true的时候按正序排列,flag=false的时候逆序排列
/*
*冒泡排序的时间复杂度
* */
public class Bubble_sort {
public static Bubble_sort bubble_sort;
private Bubble_sort(){}
private int com_step;
private int move_step;
public int getCom_step() {
return com_step;
}
public int getMove_step() {
return move_step;
}
public static Bubble_sort getBubble_sort(){
if(bubble_sort==null){
synchronized (Insert_sort.class){
if(bubble_sort==null){
bubble_sort=new Bubble_sort();
}
}
}
return bubble_sort;
}
public List<Integer> in_order(List<Integer> list, boolean flag){
com_step=0;
move_step=0;
Integer[] nums=list.toArray(new Integer[0]);//将列表list转为Integer对象数组
for(int i=0;i<list.size();i++){
for(int j=i+1;j<list.size();j++){
com_step++;
if(flag==true) {
if(nums[i]>nums[j]){
swap(nums,i,j);
move_step += 3;
}
}
else{
if(nums[j]>nums[i]) {
swap(nums, i, j);
move_step += 3;
}
}
}
}
list=new ArrayList<>(Arrays.asList(nums));
return list;
}
public void swap(Integer[] tem, int i, int j) {
int temp = tem[i];
tem[i] = tem[j];
tem[j] = temp;
}
}
[1] 吕新平、刘宏铭.二级公共基础知识实战训练教程:西安交通大学出版社,2006.02