数据结构与算法是计算机本科相关专业学生的必修课,我当年自然也是学过的,而且印象考试成绩还不错。
不过近期写了一个冒泡排序算法(不使用类库实现),竟然出现了Bug,实在惭愧。
仔细想想工作这几年一直都是使用Java集合框架和类库,因此感觉还是有必要再重温一下。
-----------------------------------------------------------
冒泡排序
基本原理:
依次比较相邻的2个元素,把小数放在前面,把大数放在后面。遍历数组的每一个元素后,最大的数放在了最后。
再次从头比较相邻2个元素,把小数放在前面,把大数放在后面。直到比较到倒数第二个数(倒数第一个数已经是最大的了)。
依此类推,直到将数组中所有元素都排序一遍。
程序实现:
public static void bubbleSort(){
int[] array=new int[]{9,8,7,6,5,4,3,2,1};
boolean noSwapFlag=true;//未发生交换标识
int temp=0;//临时变量,用于排序时的数据交换.
for (int i=0;i<array.length-1;i++) {//数组中的已排序元素.
noSwapFlag=true;//每轮排序前重置未交换标识
for (int j=0;j<array.length-i-1;j++){//每一轮排序需要遍历的元素个数.
//升序排序:如果前面的元素大于后面的元素,交换位置(小于为降序).
if (array[j] > array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
//如果有交换时,未发生交换的标识置为false.
noSwapFlag=false;
}
}
System.out.println("Sort"+i+":"+Arrays.toString(array));
if(noSwapFlag){//该轮排序中没有任何元素发生交换,代表已达到所需顺序.
System.out.println("No swap!");
break;
}
}
System.out.println("Sort Result:"+Arrays.toString(array));
}
性能分析:
1、如果目标序列为升序,而数组本身也是升序,那么只需要1次排序即可排出。排序次数为n-1次。
2、如果目标序列为升序,而数组全部元素逆序,那么需要n*(n-1)/2次比较和移动。
因此,冒泡排序的总时间复杂度为O(n^2).
空间复杂度:1。
稳定性:稳定的排序。