选择排序的工作原理是,每一次从待排序的数据中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
优化思路是,每次循环都同时找出最大和最小的值,分别放在序列的首部和尾部。这样我们在进行外层循环时,只需要遍历序列的一半,就可以完成排序。
实现思路,假设序列的第一个元素是最小的,从第二个元素开始,遍历数组碰见比第一个元素小的就和他交换位置。同理将每个元素和最后一个比较,若是大于最后一个元素,把这个元素和最后一个交换。这样每一轮循环都可以保证首尾是最小最大值。
代码如下:
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int[] a = new int[10];
int[] b = new int[10];
// 输入一个待排序的数组
System.out.println("请输入10个数字:");
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
// 排序,每次确定首位两个元素。
int temp;
for (int i = 0; i < a.length / 2 + 1; i++) {
for (int j = i; j < a.length; j++) {
if (a[j] < a[i]) { // 找到最小值
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
if (a[j] > a[a.length - i - 1]) { // 找到最大值
temp = a[j];
a[j] = a[a.length - i - 1];
a[a.length - i - 1] = temp;
}}
}
// 解决中间的元素不会被比较的问题
int count = (a.length - 1) / 2;
temp = a[count];
for (int i = count; i < a.length - 1; i++) {
a[i] = a[i + 1];
}
a[a.length - 1] = temp;// 输出语句
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}}