Java新手编写数组升序排序算法遇错,求技术帮助
帮你搞定选择排序的代码问题
嘿,别慌!作为编程新手,第一次写排序逻辑遇到这些问题太正常了~咱们先从你提到的报错开始,再一步步把你的选择排序思路补全。
首先解决最直接的报错:variable x might not have been initialized
你只声明了int[] x;,但没有给这个数组分配内存空间哦!Java里引用类型(比如数组)必须初始化才能使用,你需要给它创建和原数组a一样长度的空间:
int[] x = new int[a.length];
另外,merker == x[0];这行是比较操作(==用来判断两边是否相等),而你想做的是把merker的值赋值给x的元素,应该用单等号=:
x[某个索引] = merker;
再来梳理你的选择排序逻辑漏洞
你的思路是对的——每次选出当前数组里的最小值放到新数组x,但还有几个关键逻辑没跟上:
- 每次选完最小值后,要把原数组里的这个最小值“标记为已选”(比如设为一个极大值,避免下次重复选中)
- 外层循环的
n需要递减,不然会无限循环;同时内层循环的i每次要重置,不然只会遍历一次 - 需要一个变量记录
x数组当前要填充的位置,比如int currentIndex = 0;
修正后的完整代码
package com.company; public class Main { public static void main(String[] args) { int[] a = {11,7,8,3,15,13,9,19,18,10,4}; // 初始化x数组,长度和a一致 int[] x = new int[a.length]; // 记录x当前要填充的位置 int currentIndex = 0; // 复制原数组到临时数组,避免修改原数组(也可以直接修改原数组) int[] temp = a.clone(); int n = temp.length; while(n > 0){ // 每次循环重置merker为当前temp数组的第一个元素 int merker = temp[0]; // 记录最小值的索引,方便后续标记为已选 int minIndex = 0; int i = 1; while(i < n ) { if (temp[i] < merker){ merker = temp[i]; minIndex = i; } i++; } // 把最小值放到x数组的对应位置 x[currentIndex] = merker; currentIndex++; // 将已选的最小值标记为极大值,下次不会再选中 temp[minIndex] = Integer.MAX_VALUE; n--; } // 打印排序后的x数组 System.out.println("排序后的数组:"); for(int num : x){ System.out.print(num + " "); } } }
代码解释
- 我们用
temp数组复制原数组a,这样不会修改原数组的内容;如果你不需要保留原数组,也可以直接操作a - 每次外层循环中,先把
merker设为当前temp数组的第一个元素,然后遍历找到更小的值,同时记录最小值的索引 - 找到最小值后,把它放到
x的当前位置,然后把temp里的这个最小值改成Integer.MAX_VALUE(Java中int类型的最大值),这样下次遍历就不会再选到它 - 每次外层循环后
n减1,直到n为0,所有元素都被选到x里
这样运行代码就能得到从小到大排序后的数组啦~
内容的提问来源于stack exchange,提问作者Laffa Yett
相关产品推荐
相关产品推荐

