接着上节的选择排序,本次我们分享冒泡排序,
冒泡排序第一轮循环比较的示意图:
假如数组有n个元素,排序将进行n-1次,我们介绍第一次排序,后面的n-1次排序和前面的一样,
第一次排序,用数组Data的第一个元素Data[0]和第二个元素Data[1]进行比较,如果第一个元素Data[0]比第二个元素Data[1]大,则交换第一个元素Data[0]和第二个元素Data[1]的数值;然后第二元素Data[1]和第三个元素Data[2]进行比较,如果第二个元素Data[1]的值比第三个元素Data[2]的值大,则进行交换值,如果不大则不交换;以此类推直到第n-1个元素Data[n-2]和最后一个元素Data[n-1]比较完,则第一轮比较结束。第一轮比较结束的结果是最后一个元素Data[n-1]的值将是整个数组Data中最大的一个元素。接下来进行第二轮比较,第二轮和第一轮类似但是最后一个元素Data[n-1]不再参与比较(因为它已经明确最大),一次类推、、、、、、,总共比较完需要n-1轮比较,每次比较次数分别是n-1,n-2、、、、1.
代码如下:
public class BubbleSort implements ISortNumber {
public BubbleSort(){
}
/*
* 采用冒泡排序法惊醒排序
* */
@Override
public int[] sortASC(int[] intArray) {
if(intArray == null){
return null;
}
int[] srcDatas = intArray.clone();
boolean changedPosition = true;
int comparedTimes = 0;
int maxComparedTimes = srcDatas.length - 1;
//while((comparedTimes < maxComparedTimes)&&(changedPosition)){
while(comparedTimes < maxComparedTimes){
for(int i = 0;i < (maxComparedTimes - comparedTimes);i++){
//changedPosition = false;
if(srcDatas[i] > srcDatas[i + 1]){
swap(srcDatas,i,i+1);
//changedPosition = true;
}
}
comparedTimes++;
}
return srcDatas;
}
/*
* 交换数组中下标为src和dest的值
* @param data数组
* @param src源下标
* @param dest目标下标
* */
private void swap(int[] data,int src,int dest){
int temp = data[src];
data[src] = data[dest];
data[dest] = temp;
}
}
public interface ISortNumber {
/*
* 对整形数据按照升幂排列
* @param intArray待排序的整形数组
* @return 按照升序排列后的数组
* */
public int[] sortASC(int[] intArray);
}