交换类的排序思想就是通过交换逆序元素进行排序的方法。冒泡排序通过相邻元素的交换消除逆序,而快排则通过不相邻的元素交换消除逆序,效率相对较高。接下来说说这两种排序算法,以及算法的优化。
1.冒泡排序算法:遍历整个待排序列,遍历过程当中顺次比较相邻两个元素的大小,如果逆序就交换,所以,每一躺遍历之后,最大(假设是升序)的元素一定在最后面,像是“冒泡泡”。代码(算法的实现细节都有标注释)如下:
// 冒泡排序算法
public static void bubbleSort(int[] r) {
// 定义一个标志,判断是否数据发生了交换动作
int isChange = 0;
// 外层循环控制的是排序的躺数
for (int i = 0; i < r.length - 1; i++) {
// 内层控制的是每趟排序中需要比较的次数
for (int j = 0; j < r.length - 1 - i; j++) {
// 如果当前元素大于它后面的一个元素,则将两者交换
if (r[j] > r[j + 1]) {
swap(r, j, j + 1);
// 交换之后将isChange置为1,表示元素发生过交换
isChange = 1;
}
}
// 这一趟循环结束后,如果isChange=0,则说明数组已经有序了
// 直接跳出循环,以免发生不必要的比较与交换
if (isChange == 0)
break;
}
}
这个是做了小优化的冒泡排序算法,定义了一个标志isChange,如果待排序列本身就是有序的话其实是不会发生元素交换的,也就是说,如果遍历了一遍发现没有交换,就及时跳出循环,不用跑下一趟,此时是冒泡排序最好的情况,时间复杂度为O(n)。
与之相对的最坏情况下(完全逆序)时间复杂度就是O(n^2)啦!
由于该算法在排序过程中没有使用额外空间,空间复杂度自然为O(1)啦!
稳定性呢?当然稳定了,该算法从前往后进行,大于后面的才交换,相同的元素是没有必要交换的。
数据测试:
| 数据规模 |
1000 |
10000 |
100000 |
| 时间/s |
0.024454538 |

本文介绍了交换类排序算法中的冒泡排序和快速排序,包括算法原理、时间空间复杂度和稳定性分析。针对冒泡排序进行了优化,通过添加标志判断是否需要继续遍历。同时,讨论了快速排序的「双重夹击」策略,并提出了三数取中法优化枢轴选择,提高排序效率。实验表明,快速排序在大数据量下性能远超冒泡排序。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



