题目:对于一个int数组,请编写一个冒泡排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:[1,2,3,5,2,3],6 输出:[1,2,2,3,3,5]
思路:冒泡排序原理很简单:遍历n次,每次遍历找出一个最大的元素放到数组的最后面,第一次遍历从0开始对相邻两个元素进行比较,将较大的元素进行交换是指位于后面的位置,即总是比较a[i]与a[i+1]两个元素,i从0开始到length-2;完成第一次排序后找出了最大的元素并将其放到了末尾;然后再次遍历i从0开始到length-3,每次比较相邻两个元素大小,将大的交换到后面,完成第二次排序后找出了倒数第二大的元素并将其放到了倒数第二个位置,依次类推,程序是一个2重循环,外层循环范围是每一次未排序的范围,从i=length-1开始到i=1;内层循环从j=0开始到j=i-1; 时间复杂度O(n^2),空间复杂度O(1),稳定。
每次循环将当前数组中的最大值移动到数组末尾的有序位置,于是每次循环之后需要排序的数组范围就会缩小一个元素。于是外层循环代表当前需要进行排列的数组范围需要不断缩小。写代码时注意边界值的界定,可以通过具体化来帮助确定。
importjava.util.*;
//冒泡排序:每次遍历将最大的元素相邻交换到数组的最后面,需要排序的数组范围逐渐减小
publicclass BubbleSort {
public int[] bubbleSort(int[] A, int n) {
//特殊输入
if(A==null||A.length<=0) return A;
int temp=0;
//双重遍历,外层遍历表示需要排序的数组范围,从i=A.length-1逐渐减小到i=0
for(int i=A.length-1;i>=0;i--){
for(int j=0;j<=i-1;j++){
if(A[j]>A[j+1]){
//交换相邻的两个元素A[j]与A[j+1],将大的向后移动
temp=A[j+1];
A[j+1]=A[j];
A[j]=temp;
}
}
}
return A;
}
}