简单理解选择排序

思路:

首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到整个元素有序。

它在不断地选择剩余元素的最小者。

如下算法所示,选择排序的内循环只是在比较当前元素与目前已知的最小元素(以及将当前索引加一和检测是否下标越界),

public static void sort(Comparable[] a) {
	/*具体算法的实现*/
	//将a[]按升序排列 	int N = a.length;
	for(int i = 0; i < N; i++) {
		//将a[i]和a[i+1..N]中最小的元素交换 		int min = i ;
		for(int j = i + 1; j < N; j++) 
			if(less(a[j], a[min])) min = j;
		exch(a, i, min);
	}
}

这个算法已经简单到了极点。交换的代码写着内循环之外,每次交换都能排定一个元素,因此交换的总次数为N。所以算法的时间效率取决于比较的次数。

结论:对于长度为N的数组,选择排序需要大约N^2次比较和N次交换。

它有两个很鲜明的特点:

运行时间和输入无关。为了找出最小的元素而扫描一边数组并不能为下一次扫描提供什么信息。你会惊奇的发现,一个有序的数组或者主键全部相等的元素和一个元素随机排列的的数组所用的排序时间竟然一样长。

数据移动是最少的。每次交换都会改变两个数组元素的值,因为选择排序用了N次交换——交换次数和数组大小是线性关系。

《简单理解选择排序》
选择排序示意

    原文作者:SeYuFac
    原文地址: https://zhuanlan.zhihu.com/p/61472115
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞