冒泡排序和选择排序
冒泡排序
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的从小到大顺序比打乱这就是不稳定。
而对于选择排序,则不会出现打乱已有的满足条件的顺序,是稳定的。
稳不稳定其实取决于一趟交换几次,交换一次肯定不稳定,优化过后的冒泡排序交换一次,不稳定。