来源百度百科:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从> 大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
一.基本思想:
两个数比较大小,如果前一个数大于第二个数,就交换位置
二.过程:
- 比较相邻两个数的大小,如果第二个数小,就交换位置
- 从前往后两两比较,直接最后两个数据,这样每轮就可以确定一个最大的数字
- 继续重复上面的操作,依次将所有数据排好位置即可
假设数组为arr={12,1,36,49,26}
1.:第一趟排序
我们根据之前的描述,进行第一轮的排序
int temp;
//第一位和第二位比
if (arr[0] > arr[1]){
temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
//第二位和第三位比
if (arr[1] > arr[2]){
temp = arr[1];
arr[1] = arr[2];
arr[2] = temp;
}
//第三位和第四位比
if (arr[2] > arr[3]){
temp = arr[2];
arr[2] = arr[3];
arr[3] = temp;
}
//第四位和第五位比
if (arr[3] > arr[4]){
temp = arr[3];
arr[3] = arr[4];
arr[4] = temp;
}
第一轮排序后数组的顺序为{1,12,36,26,49},第一轮排序后最大的数字就在最后面了
2.:第二趟排序
此时,我们可以根据第一轮排序的结果{1,12,36,26,49},再次进行排序,因为最大值已经在数组最后一个元素的,所以我们就不用去比较最后一个元素了。
int temp;
//第一位和第二位比
if (arr[0] > arr[1]){
temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
//第二位和第三位比
if (arr[1] > arr[2]){
temp = arr[1];
arr[1] = arr[2];
arr[2] = temp;
}
//第三位和第四位比
if (arr[2] > arr[3]){
temp = arr[2];
arr[2] = arr[3];
arr[3] = temp;
}
第二轮排序后数组的顺序为{1,12,26,36,49},至此,排序完成
三.:总结
我们从上面的的代码可以总结出来:
- 总共有5个数,第一趟代码我们比较了4次
- 第二趟代码我们比较了三次
再从上面的规律可以总结出:5位数的数组需要4趟排序的,每趟排序之后次数减1(因为前一趟已经把前一趟数的最大值确定下来了)!
因为我使用的测试用例的数据并不是太混乱,所有只用了两趟排序就排序完成了.
我们可以根据for循环将上面的代码简化:
/**
* 冒泡排序
* @param arr 需要排序的数组
*/
public static void bubbleSort(int[] arr){
int length = arr.length;
if(length <= 1)
return;
for (int i = 0; i < length-1; i++) {
for (int j = 0; j < length-1-i; j++) {
//交换
if(arr[j] > arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
四.冒泡排序的优化问题
从上面的例子可以看出,5个元素,我们只使用了两趟就排好序了.
但是程序依然会进行第三、第四趟排序,这是完全没有必要的,所有我们可以设置一个flag,如果这趟没有任何交换,则说明数组已经是有序的了
代码如下:
/**
* 冒泡排序
* @param arr 需要排序的数组
*/
public static void bubbleSort(int[] arr){
int length = arr.length;
if(length <= 1)
return;
for (int i = 0; i < length; i++) {
//设置退出标记
boolean flag = false;
for (int j = 0; j < length-1-i; j++) {
//交换
if(arr[j] > arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
//有数据交换
flag = true;
}
}
//无数据交换,提前退出
if (!flag)
break;
}
}
五.结论
- 冒泡排序空间复杂度为O(n^2)
- 冒泡排序是基于比较的排序
- 冒泡排序是稳定的排序
六、其他排序
排序算法大集合:
如果文章有错的地方欢迎指正,大家互相交流。