简单选择排序
适用情况:常用于取序列中最大最小的几个数时。
(如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)
简单选择排序的示例:
步骤:
- 遍历整个序列,将最小的数放在最前面。
- 遍历剩下的序列,将最小的数放在最前面。
- 重复第二步,直到只剩下一个数。
如何写成代码:
- 首先确定循环次数,并且记住当前数字和当前位置。
- 将当前位置后面所有的数与当前数字进行对比,小数赋值给key,并记住小数的位置。
- 比对完成后,将最小的值与第一个数的值交换。
- 重复2、3步。
代码实现如下:
public class SelectSort {
public static void main(String[] args) {
int a[] = { 3, 1, 5, 7, 2, 4, 9, 6, 10, 8 };
SelectSort obj = new SelectSort();
System.out.println("初始值:");
System.out.println(Arrays.toString(a));
obj.selectSort(a);
System.out.println("\n排序后:");
System.out.println(Arrays.toString(a));
}
void selectSort(int a[]) {
int min;
for (int i = 0; i < a.length; i++) {
min = i; // 最小值小标,每次循环最小值下标加1
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[min]) {
min = j;
}
}
if (i != min)
swap(a, min, i);
}
}
void swap(int a[], int i, int j) {
a[i] = a[i] + a[j];
a[j] = a[i] - a[j];
a[i] = a[i] - a[j];
}
}
简单选择排序的改进——二元选择排序
简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下: