1.简单冒泡排序
用双重循环来控制,当相邻元素不满足要求的顺序排列(从小到大或从大到小)时,就将两元素交换位置,以此逐渐遍历。
- 代码1
void bubbleSort(int[] array) {
int tmp = 0;
long startTime = System.currentTimeMillis();
for (int i = 0, arrLen = array.length; i < arrLen - 1; i++) {
for (int j = 0; j < arrLen - i - 1; j++) {
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
long endTime = System.currentTimeMillis();
//打印排序后的前10个数
for(int i=0;i<10;i++){
System.out.print(array[i]+" ");
}
System.out.println("数组冒泡排序用时:" + (endTime - startTime) + "毫秒。");
}
2.有序冒泡排序
如果只遍历两三次,数组本身就已经是有序的了,那么对后面的元素继续循环地进行大小判断则是多余的了。我们可以设置一个标签来标记当前次遍历的数组是否是有序的。
- 代码2
void bubbleSortByOptim(int[] array) {
int tmp = 0;
long startTime = System.currentTimeMillis();
//记录当前是否无序的标签
boolean isUnorder = true;
for (int i = 0, arrLen = array.length; i <( arrLen - 1 )&& isUnorder; i++) {
//每次外部循环一次,isUnorder设为false,即预设当前序列已经是有序的
isUnorder = false;
for (int j = 0; j < arrLen - i - 1; j++) {
/* 只要当前内循环有两个元素需要交换位置则表明,前当序列还是无序的,将isUnorder从预设值false改为true,外循环还将继续
*只有当前序列没有任何元素需要交换位置(有序),isUnorder = false(即不进入if的代码区内),外循环将停止
*/
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
isUnorder = true;
}
}
}
long endTime = System.currentTimeMillis();
//打印排序后的前10个数
for(int i=0;i<10;i++){
System.out.print(array[i]+" ");
}
System.out.println("数组冒泡排序优化后用时:" + (endTime - startTime) + "毫秒。");
}
- 辅助代码3
int nums1[] = new int[100000];
int nums2[] = new int[100000];
public static void main(String[] cmds)
ArraySort as= new ArraySort();
as.initArrays();
as.bubbleSort(as.nums1);
as.bubbleSortByOptim(as.nums2);
}
public void initArrays() {
Random rd = new Random();
for(int i=0 ; i< nums1.length;i++){
nums1[i] =rd.nextInt(100000);
}
nums2 = Arrays.copyOf(nums1, nums1.length);
}
- 控制台输出