原理
选择排序,是冒泡排序的优化。
每一趟只交换一次。就是选择最大(或者最小的)和首位交换。
例子
现有无序数组[6 5 4 1 8 9]
第一趟找到最小数1,放到最前边(与首位数字交换)
交换前:| 6 | 5 | 4 | 1 | 8 | 9 |
交换后:| 1 | 5 | 4 | 6 | 8 | 9 |
第二趟找到余下数字[5 4 6 8 9]里的最小数4,与当前剩余数组的首位数字进行交换
交换前:| 1 | 5 | 4 | 6 | 8 | 9 |
交换后:| 1 | 4 | 5 | 6 | 8 | 9 |
第三趟继续找到剩余[5 6 8 9]数字里的最小数5,实际没有交换,5在首位置无须交换
第四趟从剩余的[6 8 9]里找到最小数6,实际没有交换
第五趟从剩余的[8 9]里找到最小数8,发现它在正确的位置,没有交换
排序完毕输出正确结果| 1 | 4 | 5 | 6 | 8 | 9 |
第一趟找到最小数1的细节
当前数组是| 6 | 5 | 4 | 1 | 8 | 9 |
先把6取出来,让它扮演最小数
当前最小数6与其它数一一进行比较,发现更小数就交换角色
当前最小数6与5比较,发现更小数,交换角色,此时最小数是5,接下来5与剩余数字比较
当前最小数5与4比较,发现更小数,交换角色,此时最小数是4,接下来4与剩余数字比较
当前最小数4与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较
当前最小数1与8比较,不动
当前最小数1与9比较,不动,到达末尾
当前最小数1与当前首位数字进行位置交换,如下所示
交换前:| 6 | 5 | 4 | 1 | 8 | 9 |
交换后:| 1 | 5 | 4 | 6 | 8 | 9 |
完成一趟排序,其余步骤类似
参考代码
/** * @Description:简单选择排序算法的实现 */ public class SelectSort { // ------------------------------------------------------- // 第一趟排序: 原始数据:5 2 8 4 9 1 // 最小数据1,把1放在首位,也就是1和5互换位置, // 排序结果:1 2 8 4 9 5 // ------------------------------------------------------- // 第二趟排序: // 第1以外的数据{2 8 4 9 5}进行比较,2最小, // 排序结果:1 2 8 4 9 5 // ------------------------------------------------------- // 第三趟排序: // 除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换 // 排序结果:1 2 4 8 9 5 // ------------------------------------------------------- // 第四趟排序: // 除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换 // 排序结果:1 2 4 5 9 8 // ------------------------------------------------------- // 第五趟排序: // 除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换 // 排序结果:1 2 4 5 8 9 // ------------------------------------------------------ public static void selectSort(int[] arr) { if (arr == null || arr.length == 0) return; int minIndex = 0; // 选择排序,是冒泡排序的优化 for (int i = 0; i < arr.length; i++) {// 只需要比较n-1次 System.out.println("i======" + i); minIndex = i; for (int j = i + 1; j < arr.length; j++) {// 从i+1开始比较,因为minIndex默认为i了,i就没必要比了。 System.out.println("j======" + j); if (arr[j] < arr[minIndex]) { minIndex = j; } } if (minIndex != i) { // 如果minIndex不为i,说明找到了更小的值,交换之。 swap(arr, i, minIndex); } } System.out.println("结果为=========================="); for (int i : arr) { System.out.println(i); } } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = { 8, 10, 2, 1, 5, 4 }; new SelectSort().selectSort(arr); } }