排序面试题是各大IT面试必考的题目,问到排序问题就会延伸出算法问题。我们先来分析下冒泡排序的程序及算法。
程序代码如下:
public class Test {
public static void bubbleSort(int[] source){
for(int i=source.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(source[j]>source[j+1]){
swap(source,j,j+1);
}
}
}
}
private static void swap(int[] source, int x, int y) {
int temp=source[x];
source[x]=source[y];
source[y]=temp;
}
public static void main(String[] args) {
int[] a={4,2,9,6,3,7,0,5,8,1};
int i;
bubbleSort(a);
for(i=0;i<10;i++){
System.out.print(a[i] );
}
}
}
冒泡排序是非常容易理解和实现的,以从小到大排序举例:
假设数组长度为N。
1、比较相邻的前后两个数据,如果前面数据大于后面数据,就将第二个数据跟第一个交换。
2、这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第N-1个位置。
3、N=N-1,如果N不为0就重复前面第二步,否则排序完成。
冒泡排序动画演示:
算法分析
(1)算法的最好时间复杂度。
若文件的初始状态是正序的,一次扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
Cmin=n-1
Mmin=0
冒泡排序最好的时间复杂度为O(n)。
(2)算法的最坏时间复杂度。
若初始文件是反序的,需要进行n-1次排序。每次排序要进行n-i次关键字的比较(1<= i <=n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
冒泡排序的最坏时间复杂度为O(n2)。
(3)算法的平均时间复杂度为O(n2)。
虽然冒泡排序不一定要进行n-1次,但是由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。
(4)算法稳定性。
冒泡排序是就地排序,且它是稳定的。