排序算法(3):选择排序(Selection Sort)

688 阅读3分钟

基本思想

选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中选择最小(大)元素,然后放到已排序的序列的末尾,以此类推,直到全部待排序的数据元素的个数为零。

算法描述

  • 初始状态:无序区为R0...n-1,有序区为空。
  • 第1趟排序
    设置一个变量i,让i从0至n-2循环的同时,在对比数组中元素i跟元素i+1的大小,如果R[i+1]比R[i]小,则用一个 变量k来记住他的位置(即k=i+1)。等到循环结束的时候,我们应该找到了R中最小的那个数的位置。然后进行判断,如果这个最小元素不是R的第一个元素,就让第一个元素跟他交换一下值,是R[0...0]和R[1...n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区
  • 第i趟排序 第i趟排序开始时,当前有序区和无序区分别为R[0...i-1]和R[i...n-1]。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[0...i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

演示

代码实现

	public static void sort(int[] array) {
		for (int i = 0; i < array.length-1; i++) {
			int temp = array[0]; //假设第一个数最大
			int tempIndex = 0;
			for (int j = 1; j < array.length-i; j++) {
				if (array[j] > temp) { //与其他数进行比较,记录下最大的数
					temp = array[j];
					tempIndex = j;
				}
			}
			//循环结束后获取到数组中最大的数和下标
			//将最大的数和最后一个数进行交换
			array[tempIndex] = array[array.length-1-i];
			array[array.length-1-i] = temp; //将最大的数放在最后
		}
	}

时间复杂度

表现最稳定的排序算法之一,因为无论什么数据进去都是O(n²)的时间复杂度,所以最优最差平均时间复杂度都是O(n²)
选择排序的交换操作介于0和 (n-1)次之间。选择排序的比较操作为 n(n-1)/2次。选择排序的赋值操作介于0和3(n-1)次之间。

空间复杂度

最优的空间复杂度,同样,就是不需要借用第三方内存空间,则复杂度为0
最差的空间复杂度就是开始元素逆序排序,每次都要借用一次内存,按照实际的循环次数,为O(N)

平均的空间负杂度为:O(1)

优点与缺点

  • 优点:数据移动次数已知为(n-1)次
  • 缺点:比较次数多

测试记录

待补充

源码

暂时未发现在开源框架或jdk中用到插入排序