Java 为什么此算法不能正确排序最后一个索引?
我应该编写一个版本的选择排序算法,将最小的数字移动到数组的前面,同时将最大的数字移动到数组的末尾。我知道它基本上是从两端工作的,所以有两个排序的子数组,但是我的代码似乎把数组中的最后一个数字放错了位置。我的代码:Java 为什么此算法不能正确排序最后一个索引?,java,arrays,sorting,selection-sort,Java,Arrays,Sorting,Selection Sort,我应该编写一个版本的选择排序算法,将最小的数字移动到数组的前面,同时将最大的数字移动到数组的末尾。我知道它基本上是从两端工作的,所以有两个排序的子数组,但是我的代码似乎把数组中的最后一个数字放错了位置。我的代码: public static void dualSelectionSort(int[]a) { for(int i=0; i<a.length-1;i++) { int min=i; int 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+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;
}
}
publicstaticvoiddualselectionsort(int[]a){
对于(int i=0;i,在外循环的每次迭代中,首先将第一个索引(i)作为初始最小索引,最后一个索引(a.length-1-i)作为初始最大索引。然后将这两个索引与范围i+1到a.length-i-1中的所有索引进行比较。但是如果第一个索引(i)实际上包含max值,您永远不会将其与[max]进行比较,因此[max]永远不会在内部循环的末尾包含正确的值
下面是一个建议的修复方法:
public static void dualSelectionSort(int[]a) {
for(int i = 0; i < a.length - i - 1; i++) {
if (a[i] > a[(a.length - 1) - i]) {
int temp = a[i];
a[i] = a[(a.length - 1) - i];
a[(a.length - 1) - i] = temp;
}
int min = i;
int max = (a.length - 1) - i;
for (int j = i + 1; j < (a.length -1 ) - 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;
}
}
publicstaticvoiddualselectionsort(int[]a){
for(int i=0;ia[(a.length-1)-i]){
int temp=a[i];
a[i]=a[(a.长度-1)-i];
a[(a.长度-1)-i]=温度;
}
int min=i;
int max=(a.length-1)-i;
对于(int j=i+1;j<(a.长度-1)-i;j++){
如果(a[j]a[max]){
max=j;
}
}
int temp1=a[min];
int temp2=a[max];
a[min]=a[i];
a[max]=a[(a.长度-1)-i];
a[i]=temp1;
a[(a.长度-1)-i]=temp2;
}
}
我改变了三件事:
外部循环结束的时间可能比您结束它的时间要快得多—一次i>=a.length-i-1
—因为在每次迭代中,您都会找到最小值和最大值,所以您会将剩余的未排序数组减少2
初始化min
和max
索引时,确保min
索引实际包含的值小于max
索引。如果a[i]>a[(a.length-1)-i]
,请在将min
设置为i
和max
设置为(a.length-1)-i
之前交换它们
内部循环应该从i+1
迭代j
到(a.length-1)-i-1
问题在于内部循环
它是从i+1开始的。
所以比较max的代码实际上是比较a[1]和a[4]
您可以将其更改为
for(int j=i;jt这还不够。尝试输入[4,5,2,1,6,10,3,9,8,0,7]
和建议的修复程序将产生[0,1,2,3,4,6,6,7,8,9,10]
。感谢您指出这一点!是正确的。以前的解决方案是不够的,如果i==max
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;
}