简单选择排序是一种选择排序(O(N2))
(1)从待排序序列中,找到关键字最小的元素;
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
初始关键字:『 8,5,2,6 』
第一趟排序后:2,『8,5,6』
第二趟排序后:2,5,『8,6』
第三趟排序后:2,5,6,『8』
public class SimpleSort {
public static void main(String[] args) {
int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
System.out.println("排序前:");
print(sort);
selectionDemo(sort);
System.out.println("\n排序后:");
print(sort);
}
public static void selectionDemo(int[] a){
for (int i = 0; i < a.length; i++) {
for (int j = i+1; j < a.length; j++) {
if(a[j]<a[i]){
int tmp = a[j];
a[j] = a[i];
a[i]=tmp;
}
}
}
}
public static void print(int[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
改进:
简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为
每趟循环确定两个元素(当前趟最大和最小记录)的位置,
从而减少排序所需的循环次数。改进后对n个数据进行排序,
最多只需进行[n/2]趟循环即可
static void selectSort(int[] r) {
int n = r.length;
int i ,j , min ,max, tmp;
for (i=0 ;i <= n/2;i++) {
// 做不超过n/2趟选择排序
min = i; max = i ; //分别记录最大和最小关键字记录位置
for (j= i+1; j<= n-1-i; j++) {
if (r[j] > r[max]) {
max = j ; continue ;
}
if (r[j]< r[min]) {
min = j ;
}
}
//该交换操作还可分情况讨论以提高效率
tmp = r[i]; r[i] = r[min]; r[min] = tmp;
tmp = r[n-1-i]; r[n-1-i] = r[max]; r[max] = tmp;
}
}