思路:
- 找到剩余数组(A[I…A.length-1])中第i小的元素(0< =i < A.length)
- 将它与数组的下标为i的元素交换位置
- 如此循环,直到i > A.length-1
引自《算法》:
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和字节交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此反复,直到将整个数组排序。
Java实现:
/***
1. 不使用额外空间交换两个数的值
2. 此方法有溢出的可能
3. @param a 数组
4. @param i 要交换的第一个数的下标
5. @param j 要交换的第二个数的下标
*/
private static void exch(int[] a,int i,int j)
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
/**
6. 从小到大对数组进行选择排序
7. @param a 要排序的数组
*/
public static void sort(int[] a)
{
int N=a.length;
for (int i = 0; i < N; i++) {
int min=i;
for (int j = i+1; j < N; j++) {
if (a[j] < a[min]) {
min=j;
}
}
exch(a,i,min);
}
}
总结:
- 对于长度为N的数组,选择排序需要大约N次交换和Math.pow(N,2)/2次比较
- 运行时间与输入无关
- 数据移动是所有算法中最少的