java - 为什么这个算法不能正确排序最后一个索引?
问题描述
我应该编写一个选择排序算法的版本,它将最小的数字移动到数组的前面,同时将最大的数字移动到数组的末尾。我知道它基本上是从两端工作的,所以有两个排序的子数组,但是我的代码似乎放错了数组中的最后一个数字。我的代码:
public static void dualSelectionSort(int[]a) {
for(int i=0; i<a.length-1;i++) {
int min=i;
int max=(a.length-1)-i;
for (int j=i+1;j<a.length-i;j++) {
if(a[j]<a[min]) {
min=j;
}
if(a[j]>a[max]) {
max=j;
}
}
int temp1=a[min];
int temp2=a[max];
a[min]=a[i];
a[max]=a[(a.length-1)-i];
a[i]=temp1;
a[(a.length-1)-i]=temp2;
}
}
如果给定输入 [5,4,3,2,1],它将输出 [1,2,5,3,4] 而不是 [1,2,3,4,5]。我错过了什么?
解决方案
问题出在内部循环中。
它从 i+1 开始。所以比较max的代码实际上是比较a[1]和a[4]。
你可以把它改成
for (int j=i;j<a.length-i;j++)
此外,正如您在评论中看到的那样,在进行上述更改后,代码仍然无法正常工作。这将发生,因为i == max
现有的交换方法将不起作用。例如:假设数组 =[6,4,5],内循环最大值 =0,min=1。现有交换将使其变为 [4,6,6]。因此,应以不同方式处理交换。
if(i==max) {
swap(a,max,a.length-1-i);
swap(a,min,i);
}else {
swap(a,min,i);
swap(a,max,(a.length-1)-i);
}
完整代码如下:
public static void dualSelectionSort(int[]a) {
for(int i=0; i<a.length-1;i++) {
int min=i;
int max=(a.length-1)-i;
for (int j=i;j<a.length-i;j++) {
if(a[j]<a[min]) {
min=j;
}
if(a[j]>a[max]) {
max=j;
}
}
if(i==max) {
swap(a,max,a.length-1-i);
swap(a,min,i);
}else {
swap(a,min,i);
swap(a,max,(a.length-1)-i);
}
}
}
public static void swap(int[] a,int i,int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
推荐阅读
- python - 将句子列表转换为单词标记列表
- json - 从一个巨大的 json 文件 (18mb) 中存储、读取和提取信息以在我的 React.js 项目中使用的最佳方法是什么?
- python - 现有的 django 模块名称与新的 pip 包冲突
- mysql - 如何合并两个连接表中的行?
- python - 如何使用 PyList 在 Python C API 扩展中返回整数列表?
- woocommerce - 在 woocommerce 新订单电子邮件和已完成订单电子邮件上显示产品图片
- docker - 查找哪个容器使用 Docker Volume
- r - 鼠标悬停填充区域时突出显示边框 - Leaflet-R
- visual-studio-code - Visual Studio Code 无法在 Ubuntu 18.04 中运行
- android - 如何对从 Google Play 安装的应用程序使用 Layout Inspector?