选择排序
步骤
选择排序思路特别简单:选择n个数里最小的那个数,交换它和第1个数的位置。在剩下的数字列表里选择最小的数,交换它和第2个数的位置。总之就是每一轮找到最小的数的坐标,交换到相应的位置。
伪代码:
void Selection_Sort(ElementType A[],int N) {
for(i = 0;i < N;i++) {
MinPosition = ScanForMin(A,i,N-1);
// 从A[i]到A[N-1]中找到最小的元,并将其位置赋给MinPosition
Swap(A[i],A[MinPosition]);
// 将未排序部分的最小元换到有序部分的最后位置
}
}
Java代码实现
public void sort(int[] arr) {
// 总共经过n-1轮比较,最后第n轮就已经排好序了
for (int i = 0; i < arr.length; i++) {
// 最小元素的坐标
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
// 找到目前能找到的最小的记录
if (this.less(arr[j], arr[minIndex])) {
minIndex = j;
}
}
// 交换记录
if (minIndex != i) {
this.exchange(arr, minIndex, i);
}
}
}
时间复杂度
交换部分最差的情况就是每次都交换,最多交换n-1次,因为最后一次交换肯定是能使两个数都归位的。
找最小元素坐标的部分,每次都要把数组除有序部分都扫描一遍,所以整个时间复杂度是O(n^2)。
ScanForMin(A,i,N-1)
可以用最小堆优化,就得到了堆排序。