前言
排序算法事很重要的算法之一,几乎是Java的面试必问题了,在此通过几篇博文,总结一下几种常见的排序算法。当然这只是其中的几个。
排序算法可以分为内部排序和外部排序。
- 外部排序通常是读数据量很大的数据进行排序,且因为需要排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
- 内部排序需要排序的数据量相对较小。是将需要排序的数据记录在内存中进行排序。
博文链接:(点击排序名称可看到不同排序的博文。不断更新中…)
常见的内部排序算法有:冒泡排序、选择排序、插入排序、希尔排序、快速排序
几种排序的比较:
排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
冒泡排序 | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(1) | 不稳定 |
插入排序 | O(n2) | O(1) | 稳定 |
快速排序 | O(n logn) | O(log n) | 不稳定 |
归并排序 | O(n logn) | O(n) | 稳定 |
希尔排序 | O(n logn) | O(1) | 稳定 |
冒泡排序
-
排序方式
从第一个数字起,依次比较相邻的两个数字,如果他们的顺序不符合要求,就将两个数字的顺序交换。这个过程是重复循环进行的,直到所有的数字都按照要求排好顺序。 -
排序讲解
例如对:6 5 3 4 9 进行从小到大排序。具体的过程为:
第一次外循环:
用第一个数字6作为第一轮的开始,依次比较相邻的数字。- 第一次内循环:第一个数字和第二个数字比较,于是6和5相比,5小,交换6和5的顺序,顺序变为:5 6 3 4 9
- 第二次内循环:第二个数字和第三个数字比较,于是6和3相比,3小,交换6和3的顺序,顺序变为:5 3 6 4 9
- 第三次内循环:第三个数字和第四个数字比较,于是6和4相比,4小,交换6和4的顺序,顺序变为:5 3 4 6 9
- 第四次内循环:第四个数字和第五个数字比较,于是6和9相比,6小,不需要交换,顺序依然为:5 3 4 6 9。
至此,第一层外循环结束,本轮结束后,数据顺序为:5 3 4 6 9。经过第一次排序,最大的数字已经在最后一个了,因此第二轮排序就不需要比较最后一个和倒数第二个数字了。
第二次外循环:
用第一个数字5作为第二轮的开始,依次比较相邻的数字。- 第一次内循环:第一个数字和第二个数字比较,于是5和3相比,3小,交换3和5的顺序,顺序变为:3 5 4 6 9
- 第二次内循环:第二个数字和第三个数字比较,于是5和4相比,4小,交换4和5的顺序,顺序变为:3 4 5 6 9
- 第三次内循环:第三个数字和第四个数字比较,于是5和6相比,5小,不需要交换顺序,顺序为:3 4 5 6 9
本轮结束后,数据顺序为:3 4 5 6 9。经过第二次排序,倒数第二大的数字已经在倒数第二位了,排序就不需要比较倒数第二个数字和倒数第三个了。
第三次外循环:
用第一个数字3作为第三轮的开始,依次比较相邻的数字。- 第一次内循环:第一个数字和第二个数字比较,于是3和4相比,3小,不需要交换顺序,顺序为:3 4 5 6 9
- 第二次内循环:第二个数字和第三个数字比较,于是4和5相比,4小,不需要交换顺序,顺序为:3 4 5 6 9
第四次外循环:
用第一个数字3作为第三轮的开始,依次比较相邻的数字。- 第一次内循环:第一个数字和第二个数字比较,于是3和4相比,3小,不需要交换顺序,顺序为:3 4 5 6 9
-
代码实现
/**
* 冒泡排序
* @param arr 需要排序的数组
*/
public static void mpSort(int arr[]){
// 第一层循环
for(int i = 0;i < arr.length - 1;i++){
// 第二层循环
for(int j = 0;j < arr.length - i - 1;j++){
// 如果相邻的两个数字的顺序不对,就交换。
if (arr[j] > arr[j+1]){
int k = arr[j];
arr[j] = arr[j+1];
arr[j+1] = k;
}
}
}
}
}