我必须根据以下参数在Java中实现Selection Sort:
为SelectionSort实现一个变体,它在扫描列表时分别定位最小和最大元素,并将它们分别放在列表的开头和结尾。在第一个通道上,扫描元素x0,...,xn-1;在第二个传递中,扫描元素x1,...,xn-2;等等。
我传递的方法是一个大小为32的数组,当我打印数组时,它没有被排序。我的代码有什么问题?
static void selectionSort() {
scramble();
int smallIndex = 0; //index of smallest to test
int largeIndex = array.length - 1; //index of largest to test
int small = 0; //smallest
int large; //largest
int smallLimit = 0; //starts from here
int largeLimit = array.length - 1; //ends here
int store; //temp stored here
int store2;
for(int i = 0; i < array.length/2; i++) { //TODO not working...
small = array[smallLimit];
large = array[largeLimit];
for(int j = smallLimit; j <= largeLimit; j++) {
if(array[j] < small) {
smallIndex = j;
small = array[j];
}
else if(array[j] > large) {
largeIndex = j;
large = array[j];
}
}
store = array[smallLimit];
store2 = array[smallIndex];
array[smallLimit] = store2;
array[smallIndex] = store;
store = array[largeLimit];
array[largeLimit] = array[largeIndex];
array[largeIndex] = store;
smallLimit++;
largeLimit--;
}
print();
}
答案 0 :(得分:1)
考虑极端情况:在smallLimit
或largeLimit
找到最大或最小的项目时会发生什么。当发生这种情况时,你有两个问题:
largeIndex
和smallIndex
未设置。它们保留了之前迭代的值。这些问题很容易解决。您可以按照一些准则避免此问题:
small
获取smallIndex
的值,如果您刚使用smallIndex
,则不会有不同变量失步的危险。smallIndex
而不是在编译器之外,那么编译器会告诉你在交换之前没有设置它。答案 1 :(得分:0)
就像@Joni明确指出的那样,在遍历数组期间,交换两个两次元素存在很大的警告。由于您必须实现排序算法就地,因此您需要在连续发生时考虑要交换的元素的位置。
您需要看到的另一个限制情况是,只剩下三个元素,即for
循环的最后一次迭代。我就是这样做的:
store = array[smallLimit];
store2 = array[smallIndex];
array[smallLimit] = small;
array[smallIndex] = store;
smallLimit++;
//No problem with swapping the first two elements
store = array[largeLimit];
//However the first swap might cause the other elements to shift
//So we do this check
if((array[largeIndex] == large))
{array[largeLimit] = array[largeIndex];
array[largeIndex] = store;
largeLimit--;
}
//Just a limiting case, where amongst the last three elements, first swap happens.
//The smallest element is in place, just take care of the other two elements.
if(largeLimit - smallLimit == 1){
if(array[largeLimit] != large){
array[smallLimit] = array[largeLimit];
array[largeLimit] = large;
largeLimit--;
}
}
根据您的代码构建DEMO以获取上述代码段。希望它能让你开始朝着正确的方向前进。