冒泡排序和选择排序

冒泡排序

 1 package com.cxx.cebc;
 2 
 3 import java.util.Arrays;
 4 
 5 /*
 6  * 冒泡排序:
 7  *从 arr[0]起,前一个依次和后一个比,谁大谁放后面,直到最后一个元素,确定最大的
 8  *从 arr[0]起,前一个依次和后一个比,谁大谁放后面,直到次后个元素,确定第二二的
 9  *从 arr[0]起,前一个依次和后一个比,谁大谁放后面,直到次次后个元素,确定第三大的
10  *..........
11  * .........
12  */
13 public class BubblingSort {
14     public static void main(String[] args) {
15         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
16 
17         System.out.println(Arrays.toString(arr) + " 原始数据。。。。。");
18         sort(arr);
19         System.out.println(Arrays.toString(arr) + "排序完成。。。。。。");
20     }
21 
22     /*
23      * 冒泡排序算法
24      */
25     public static void sort(int[] arr) {
26         //记录交换次数
27         int count = 0;
28         //外层for循环
29         for (int i = 0; i < arr.length; i++) {
30             //前后两数比较,满足条件则交换
31             for (int j = 1; j < arr.length - i; j++) {
32                 if (arr[j - 1] > arr[j]) {
33                     arr[j] = arr[j - 1] + arr[j];
34                     arr[j - 1] = arr[j] - arr[j - 1];
35                     arr[j] = arr[j] - arr[j - 1];
36                     count++;
37                     System.out.println(Arrays.toString(arr) + " 正在排序中.........");
38                 }
39             }
40         }
41         System.out.println("排序后的数组:" + Arrays.toString(arr) + "\n 排序次数:" + count);
42     }
43 }

执行结果

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8] 原始数据。。。。。
[1, 6, 2, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
[1, 2, 6, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
[1, 2, 6, 7, 3, 9, 4, 5, 10, 8] 正在排序中.........
[1, 2, 6, 7, 3, 4, 9, 5, 10, 8] 正在排序中.........
[1, 2, 6, 7, 3, 4, 5, 9, 10, 8] 正在排序中.........
[1, 2, 6, 7, 3, 4, 5, 9, 8, 10] 正在排序中.........
[1, 2, 6, 3, 7, 4, 5, 9, 8, 10] 正在排序中.........
[1, 2, 6, 3, 4, 7, 5, 9, 8, 10] 正在排序中.........
[1, 2, 6, 3, 4, 5, 7, 9, 8, 10] 正在排序中.........
[1, 2, 6, 3, 4, 5, 7, 8, 9, 10] 正在排序中.........
[1, 2, 3, 6, 4, 5, 7, 8, 9, 10] 正在排序中.........
[1, 2, 3, 4, 6, 5, 7, 8, 9, 10] 正在排序中.........
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 排序次数:13
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]排序完成。。。。。。

 

优化后的冒泡排序

 1 package com.cxx.cebc;
 2 
 3 import java.util.Arrays;
 4 
 5 public class OptimizeBubblingSort {
 6     public static void main(String[] args) {
 7         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
 8 
 9         System.out.println(Arrays.toString(arr) + " 原始数据。。。。。");
10         sort(arr);
11         System.out.println(Arrays.toString(arr) + "排序完成。。。。。。");
12     }
13 
14     /*
15      * 冒泡排序算法
16      */
17     public static void sort(int[] arr) {
18         //记录交换次数
19         int count = 0;
20         //外层for循环
21         for (int i = 0; i < arr.length; i++) {
22             //记录下最大数的下标,默认当前序列尾部元素最大
23             int index = arr.length - 1 - i;
24             //查找当前序列真实的最大的数下标
25             for (int j = 1; j < arr.length - i; j++) {
26                 if (arr[j - 1] > arr[index]) {
27                     index = j - 1;
28                 }
29             }
30             //如果不是尾部元素最大,则交换并记录交换次数
31             if (index != arr.length - 1 - i) {
32                 arr[arr.length - 1 - i] = arr[index] + arr[arr.length - 1 - i];
33                 arr[index] = arr[arr.length - 1 - i] - arr[index];
34                 arr[arr.length - 1 - i] = arr[arr.length - 1 - i] - arr[index];
35                 count++;
36                 System.out.println(Arrays.toString(arr) + " 正在排序中.........");
37             }
38         }
39         System.out.println("排序次数:" + count);
40     }
41 }

执行结果

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8] 原始数据。。。。。
[6, 1, 2, 7, 9, 3, 4, 5, 8, 10] 正在排序中.........
[6, 1, 2, 7, 8, 3, 4, 5, 9, 10] 正在排序中.........
[6, 1, 2, 7, 5, 3, 4, 8, 9, 10] 正在排序中.........
[6, 1, 2, 4, 5, 3, 7, 8, 9, 10] 正在排序中.........
[3, 1, 2, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
[2, 1, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
排序次数:7
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]排序完成。。。。。。

选择排序

 1 package com.cxx.cebc;
 2 
 3 import org.junit.Test;
 4 
 5 import java.util.Arrays;
 6 
 7 /*
 8  * 选择排序:
 9  * arr[0]依次和arr[1]...arr[arr.length-1]比较,记录下最小的数,与arr[0]交换位置
10  * arr[1]依次和arr[2]...arr[arr.length-1]比较,记录下最小的数,与arr[1]交换位置
11  * arr[2]依次和arr[3]...arr[arr.length-1]比较,记录下最小的数,与arr[2]交换位置
12  * .........
13  *
14  * .........
15  */
16 public class SelectionSort {
17     public static void main(String[] args) {
18         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
19 
20         System.out.println(Arrays.toString(arr) + " 原始数据。。。。。");
21         sort(arr);
22         System.out.println(Arrays.toString(arr) + "排序完成。。。。。。");
23     }
24 
25     /*
26      * 选择排序算法
27      */
28     @Test
29     public static void sort(int[] arr) {
30         //记录交换次数
31         int count = 0;
32         //外层循环
33         for (int i = 0; i < arr.length; i++) {
34             //记录最小的元素下标,默认头部元素最小
35             int index = i;
36             //查找当前序列中最小的元素下标
37             for (int j = i + 1; j < arr.length; j++) {
38                 if (arr[j] < arr[index]) {
39                     index = j;
40                 }
41             }
42             //如果不是头部元素最小,则交换并记录交换次数
43             if (index != i) {
44                 arr[index] = arr[index] + arr[i];
45                 arr[i] = arr[index] - arr[i];
46                 arr[index] = arr[index] - arr[i];
47                 count++;
48                 System.out.println(Arrays.toString(arr) + " 正在排序中.........");
49             }
50 
51         }
52         System.out.println("排序次数:" + count);
53     }
54 
55 }

执行结果

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8] 原始数据。。。。。
[1, 6, 2, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
[1, 2, 6, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
[1, 2, 3, 7, 9, 6, 4, 5, 10, 8] 正在排序中.........
[1, 2, 3, 4, 9, 6, 7, 5, 10, 8] 正在排序中.........
[1, 2, 3, 4, 5, 6, 7, 9, 10, 8] 正在排序中.........
[1, 2, 3, 4, 5, 6, 7, 8, 10, 9] 正在排序中.........
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
排序次数:7
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]排序完成。。。。。。

对比总结


1、冒泡排序是相邻两个数比,这两个比较的数一致在向右移动,选择排序是固定一个位置的数和其后的数比,只
有一个数在移动。优化过后的冒泡排序实际上就是选择排序。

2、对于数组从小到大排序
冒泡排序第X趟下来确定第X大的元素,放在数组的倒数第X个位置
选择排序第X趟下来确定第X小的元素,放在数组的顺数第X个位置

冒泡排序一趟会交换很多次,是稳定的。
选择排序一趟只交换一次,是不稳定的。
稳定和不稳定:
比如对于数组5,6,2,8,1
原本5,6顺序符合要求,但选择排序第一趟下来,2和5交换位置,5,6的从小到大顺序比打乱这就是不稳定。
而对于选择排序,则不会出现打乱已有的满足条件的顺序,是稳定的。
稳不稳定其实取决于一趟交换几次,交换一次肯定不稳定,优化过后的冒泡排序交换一次,不稳定。

posted @ 2021-04-20 21:39  chenxiangxiang  阅读(1143)  评论(0编辑  收藏  举报