排序问题一直是计算机编程的重要问题。
而选择排序、插入排序、冒泡排序都是多种排序算法中比较简单、容易实现的排序算法,这几种排序算法的平均事件复杂都是O(n2)
这里用数组java int[] a = {10, 35, 97, 23, 66, 27, 19};
来进行讲解。
实现思想一样,但是实现代码可能略有不同。
选择排序
实现思想:
1,遍历数组,选择最小的元素放在第一个位置。
2,从第2个位置开始遍历数组,从中将最小的元素放在第2个位置。
3,从第3个位置开始遍历数组,从中将最小的元素放在第3个位置。
······
直到倒数第二个位置为止,因为最后一个位置不用排序,从前面的每次选择中,剩下的最后一个位置一定是最大的元素。
例子
选择排序
原顺序:10 35 97 23 66 27 19
[]为已经排好序的部分
第一步:[10] 35 97 23 66 27 19
第二步:[10 19] 97 35 66 27 23
第三步:[10 19 23] 97 66 35 27
第四步:[10 19 23 27] 97 66 35
第五步:[10 19 23 27 35] 97 66
第六步:[10 19 23 27 35 66] 97
无需第七步,数组已经变得有序了。
java实现代码
static void selectSort(int[] a){
System.out.println("选择排序");
for (int i = 0; i < a.length - 1; i++){
for (int j = i + 1; j < a.length; j++){
//总是将最小的数放在当前数组最前面的位置
if (a[i] > a[j]){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
插入排序
实现思想:
1,假设第1个元素是一个有序数组,然后将第2个元素插入到前面的数组中,
2,由于前面的那个数组是有序的,所以第2个与第1个元素进行比较,如果比第1个大的话就放在第2个位置,如果比第1个元素小的话就插入到第一个位置。
3,将第3个元素插入到含有两个元素的前面的有序数组中合适的位置,要与第2个元素进行比较,如果大了就放在第3个位置,如果小于第2个元素,则要与第1个元素比较,从而找到合适的位置。
······
例子
选择排序
原顺序:10 35 97 23 66 27 19
[]为已经排好序的部分
第一步:[10 35] 97 23 66 27 19
第一步:[10 35 97] 23 66 27 19
第一步:[10 23 35 97] 66 27 19
第一步:[10 23 35 66 97] 27 19
第一步:[10 23 27 35 66 97 ] 19
第一步:[10 19 23 27 35 66 97]
无需第七步,数组已经变得有序了。
java实现代码
static void insertSort(int[] a){
System.out.println("插入排序");
for (int i = 1; i < a.length; i++){
for (int j = i-1; j > 0; j--){
if (a[j + 1] < a[j]){
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
冒泡排序
实现思想:
1,遍历数组,选择大的元素放在最后的位置。
2,遍历数组,选择第2大的元素放在倒数第2的位置。
3,遍历数组,选择第3大的元素放在倒数第3的位置。
······
例子
冒泡排序
原顺序:10 35 97 23 66 27 19
[]为已经排好序的部分
第一步:10 35 23 66 27 19 [97]
第二步:10 23 35 27 19 [66 97]
第三步:10 23 27 19 [35 66 97]
第四步:10 23 19 [27 35 66 97]
第五步:10 19 [23 27 35 66 97]
第六步:10 [19 23 27 35 66 97]
无需第七步,数组已经变得有序了。
java实现代码
static void bubbleSort(int[] a){
System.out.println("冒泡排序");
for (int i = 0; i < a.length; i++){
for (int j = 0; j < a.length - i - 1; j++){
//总是将最大的数放在当前数组最后面的位置
if (a[j+1] < a[j]){
int t = a[j+1];
a[j+1] = a[j];
a[j] = t;
}
}
}
}