
Java
public class Ersatz {
public static void main(String[] args) {
int[] ints = new int[8];
for (int v = 0; v < ints.length; ++v) {
ints[v] = (int) (Math.random() * 9) + 1;
}
System.out.println(Arrays.toString(ints));
selectionSort(ints);
System.out.println(Arrays.toString(ints));
}
private static void selectionSort(int[] array) {
/*
length
0 length - 1
1 length - 2
length -2 1
*/
int v = 0;
for (int i = 1; i < array.length; i++) {
v += i;
}
System.out.println("v = " + v);
int count_iter = 0, count_swap = 0, minIndex;
for (int i = 0; i < array.length - 1; i++) {
minIndex = i;
for (int j = i + 1; j < array.length; j++) {
count_iter++;
if (array[minIndex] > array[j]) {
minIndex = j;
}
}
if (minIndex != i) {
count_swap++;
array[minIndex] = array[minIndex] ^ array[i];
array[i] = array[minIndex] ^ array[i];
array[minIndex] = array[minIndex] ^ array[i];
}
}
System.out.println("count_iter = " + count_iter);
System.out.println("count_swap = " + count_swap);
}
}
reversed order
public class Ersatz {
public static void main(String[] args) {
int[] ints = new int[8];
for (int v = 0; v < ints.length; ++v) {
ints[v] = (int) (Math.random() * 9) + 1;
}
System.out.println(Arrays.toString(ints));
selectionSort(ints);
System.out.println(Arrays.toString(ints));
}
private static void selectionSort(int[] array) {
/*
length
0 length - 1
1 length - 2
length -2 1
*/
int v = 0;
for (int i = 1; i < array.length; i++) {
v += i;
}
System.out.println("v = " + v);
int count_iter = 0, count_swap = 0, maxIndex;
for (int i = array.length - 1; i > 0; --i) {
maxIndex = i;
for (int j = i - 1; j >= 0; --j) {
count_iter++;
if (array[maxIndex] < array[j]) {
maxIndex = j;
}
}
if (maxIndex != i) {
count_swap++;
array[maxIndex] = array[maxIndex] ^ array[i];
array[i] = array[maxIndex] ^ array[i];
array[maxIndex] = array[maxIndex] ^ array[i];
}
}
System.out.println("count_iter = " + count_iter);
System.out.println("count_swap = " + count_swap);
}
}
Enhanced
public class Ersatz {
public static void main(String[] args) {
int[] ints = new int[8];
for (int v = 0; v < ints.length; ++v) {
ints[v] = (int) (Math.random() * 9) + 1;
}
ints = new int[]{1, 8, 9, 5, 1, 4, 6, 5};
System.out.println(Arrays.toString(ints));
selectionSort(ints);
System.out.println(Arrays.toString(ints));
}
private static void selectionSort(int[] array) {
int iterations = 0, swaps = 0, minIndex, maxIndex, orignalMaxIndex;
for (int i = 0; i < array.length / 2; ++i) {
minIndex = i;
maxIndex = array.length - 1 - i;
orignalMaxIndex = maxIndex;
for (int j = i + 1; j <= array.length - 1 - i; ++j) {
iterations++;
if (array[minIndex] > array[j]) {
minIndex = j;
}
if (array[maxIndex] < array[array.length - 1 - j]) {
maxIndex = array.length - 1 - j;
}
}
if (minIndex != i) {
swaps++;
array[minIndex] = array[minIndex] ^ array[i];
array[i] = array[minIndex] ^ array[i];
array[minIndex] = array[minIndex] ^ array[i];
if (maxIndex == i) { // 如果maxIndex == i,而且发生交换(minIndex != i),则maxIndex位置的元素被交换到了minIndex处
maxIndex = minIndex;
}
}
if (maxIndex != orignalMaxIndex) {
swaps++;
array[maxIndex] = array[maxIndex] ^ array[orignalMaxIndex];
array[orignalMaxIndex] = array[maxIndex] ^ array[orignalMaxIndex];
array[maxIndex] = array[maxIndex] ^ array[orignalMaxIndex];
}
System.out.println("minIndex = " + minIndex);
System.out.println("maxIndex = " + maxIndex);
System.out.println(Arrays.toString(array));
}
System.out.println("count_iter = " + iterations);
System.out.println("count_swap = " + swaps);
}
}
Python
import random
m = [x + 1 for x in range(9)]
random.shuffle(m)
awe = [
m,
[x for x in range(1, 10)],
[x - 1 for x in range(10, 1, -1)],
[1 for x in range(9)],
[2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
print(*awe, sep='\n')
for item in awe:
iterations = 0
swaps = 0
length = len(item)
for i in range(length // 2):
min_index = i
max_index = -i - 1
max_origin = max_index
for j in range(i + 1, length - i):
iterations += 1
if item[min_index] > item[j]:
min_index = j
if item[max_index] < item[-j - 1]:
max_index = -j - 1
# maximum and minimum equal, so all elements are equal
if item[min_index] == item[max_index]:
break
if min_index != i:
swaps += 1
item[min_index], item[i] = item[i], item[min_index]
if max_index == i - length: # negative index, so max_index == i - length
max_index = min_index - length
if max_index != max_origin:
swaps += 1
item[max_index], item[max_origin] = item[max_origin], item[max_index]
print(*awe, sep='\n')