冒泡排序的基本思想是
从最开始位置的元素操作与相邻的元素作比较找出较大的放到后面,
然后将这个较大的元素与后面的元素再比较找出较大的元素放到后面,
以此类推,直到把一系列比较中最大的值放到最后面去。
重复n-1次这样的操作,即可排序完成。
最基本的思路:
public static void sort(Comparable[] arr) {
for(int i = 0; i < arr.length - 1; i ++){
for(int j = 1; j < arr.length - i; j ++) {
if(arr[j].compareTo(arr[j-1]) < 0)
swap(arr, j, j-1);//将数组arr中第j和第j-1个元素交换位置
}
}
}
改进思路:
当在某一轮遍历的过程中没有发生交换的时候,其实就说明排序已经完成了,
这个时候只要在循环过程中设置一个标记,用来存放该轮遍历是否发生过交换操作,
然后外层循环只要判定这个标记就可以知道是否排序已经完成。
public static void sort(Comparable[] arr) {
boolean flag;
int i = 0;
do{
flag = false;//标记是否交换过位置,如果没有交换过位置则说明排序完成,可以直接退出排序算法
for(int j = 1; j < arr.length - i; j ++) {
if(arr[j].compareTo(arr[j-1]) < 0) {
swap(arr, j, j-1);//将数组arr中第j和第j-1个元素交换位置
flag = true;
}
}
i ++;
}while(flag);
}
冒泡排序的进一步改进:
如果在前一次的比较中,后面的数字只进行了比较而没有进行交换,
说明这次的比较就可以在上次最后一次交换的位置终止,而不用再往后进行只比较不交换的操作了,
这样就进一步少了几次比较的操作。
public static void sort(Comparable[] arr) {
int n = arr.length;
int stop;
do {
stop = 0;
for(int i = 1; i < n;i ++) {
if(arr[i].compareTo(arr[i-1]) < 0) {
swap(arr,i,i-1);//将数组arr中第j和第j-1个元素交换位置
stop = i;
}
}
n = stop;
}while(stop > 0);
}
-----------------------------------------------------------------------------------
学习来源:慕课网《算法与数据结构》