选择排序思想:
假设有一个数组,int arr = {5,2,3,1;4}
第一步:从下标0-4中找到最小数字对应的下标,与下标为0的数字进行交换
第二步:从下标1-4中找到最小数字对应的下标,与下标为1的数字进行交换
。。。。。。
最后一步:数组中最大的两个下标对应的数字作比较,谁小就把谁放到前面
选择排序代码及细节:
1 int[] array = {6,5,3,4,1}; //5个数字 2 //要比较数组中n个元素 3 /** 4 * 为什么要写成array.length - 1呢? 5 * 这实际上是对选择排序的一种优化,若不进行-1操作,当i取值4时已经进入循环 6 * 此时j=5,但不满足j < array.length导致循环终止,这样就导致运行时间增加 7 * 当然,此处array.length是否-1对于结果没有影响 8 */ 9 for (int i = 0;i < array.length - 1; i++){ 10 //设置最小下标 11 int minIndex = i; 12 //要比较n-1轮 13 for (int j = i + 1;j < array.length; j++){ 14 /** 15 * 为什么要与array[minIndex]进行比较呢? 16 * 在遍历时每一次的array[j]都要去和最小的数进行比较 17 * 而本次比较之前最小的数是minIndex下标所在位置的数 18 */ 19 if (array[j] < array[minIndex]){ 20 minIndex = j; 21 } 22 } 23 int a = array[i]; 24 array[i] = array[minIndex]; 25 array[minIndex] = a; 26 } 27 for (int i = 0; i<array.length;i++){ 28 System.out.println(array[i]); 29 }
输出结果:1,3,4,5,6
选择排序做交换时采用异或会出错:
我们在进行数字交换时常用的方法是采用一个中间变量进行值的存储,这种方法效率比较低。
还有一种方法为异或进行值的交换:
上面程序中我们已经找到了最小值minIndex,要交换下标为minIndex与i对应的数字,如果使用异或
1 array[i] = array[i] ^ array[minIndex]; 2 array[minIndex] = array[i] ^ array[minIndex]; 3 array[i] = array[i] ^ array[minIndex];
输出结果:1,3,4,0,6
为什么这里的结果会由5变为0呢?
在选择排序的过程中很可能会出现当前下标对应数组中的值就是最小值的情况,那么就意味着该位置上的值就是从该位置到最后位置范围内数字中最小的值
此时也就说明该值不需要进行交换操作,结合上面代码会出现:i = minIndex
而此时再进行异或运算:array[i] = array[i] ^ array[minIndex]时就会出现array[i] = 0的情况
这也就是为什么上面使用异或输出结果中5变为了0的原因