Loading

选择排序

选择排序

img

步骤

选择排序思路特别简单:选择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)可以用最小堆优化,就得到了堆排序。

posted @ 2021-11-08 21:22  非凡岁月  阅读(23)  评论(0编辑  收藏  举报