以下Java实现的排序代码属于选择排序还是冒泡排序?
排序类型判定结论
你提供的代码既不是标准冒泡排序,也不是标准选择排序,属于选择排序的非最优变种实现。另外补充:排序算法的类型和你是否使用compareTo方法没有任何关联,compareTo只是Java中用于对象大小比较的通用方法,不影响排序逻辑的分类。
为什么不是冒泡排序
标准冒泡排序的核心特征是:
- 内层循环仅比较相邻位置的两个元素
- 每轮内层遍历会把未排序区间的最大元素逐步交换到未排序区间的末尾,类似"水泡上浮"的过程
你的代码内层循环是固定拿m位置的元素和后面所有位置的元素直接比较交换,完全没有相邻比较、逐步后移的逻辑,所以肯定不属于冒泡排序。
为什么是选择排序的变种
标准选择排序的核心特征是:
- 每轮外层循环的目标是确定未排序区间起始位置
m的最终值 - 内层循环仅记录未排序区间的最小值下标,全程不做交换,遍历完找到最小值后仅执行1次交换,把最小值换到
m位置
你的代码核心目标和选择排序一致:每轮确定m位置的最终最小值,但实现上做了简化——每找到一个比row[m]小的元素就直接交换,无需额外记录最小值下标,代价是单轮内层循环最多可能执行(数组长度 - m - 1)次交换,交换次数远高于标准选择排序,性能更差。
标准选择排序的实现参考(可对比差异)
import java.util.Arrays; public class SelectionSort { public static void main(String args[]) { String[] row = {"apple", "orange", "banana", "grapes", "mango", "avocado"}; int length = row.length; for(int m = 0; m < length - 1; m++) { // 先记录未排序区间最小值的下标 int minIndex = m; for (int n = m + 1; n < length; n++) { if(row[minIndex].compareTo(row[n]) > 0){ minIndex = n; } } // 内层循环走完仅做1次交换 if (minIndex != m) { String temp = row[m]; row[m] = row[minIndex]; row[minIndex] = temp; } } System.out.println("Expected Outcome: " + Arrays.toString(row)); } }
内容的提问来源于stack exchange,提问作者Prayer4Mee
相关产品推荐
相关产品推荐

