Bootstrap

选择排序算法

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

  选择排序就是从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的最后。

  如何找出最小的一个元素呢? 先随便选一个元素假设它为最小的元素(默认为序列的第一个元素),然后让这个元素与序列中的每一个元素进行比较,如果遇到比自己小的元素,那更新最小值下标,直到把序列中的元素遍历完,那最后的最小值就是序列中的最小值。

  例如: 使用选择排序算法将数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序。
  步骤:1. 在一个长度为n的无序数组中,第一次遍历n-1个数找到最小的和第一个数交换。
     2. 第二次从下一个数开始遍历n-2个数,找到最小的数和第二个数交换。
     3. 重复以上操作直到第n-1次遍历最小的数和第n-1个数交换,排序完成。

在这里插入图片描述
  实现代码如下所示。

#include<iostream>
using namespace std;

void SelectSort(int *list, const int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int min = i;  //min为最小值索引
		for (int j = i + 1; j < n; j++)
		{
			if (list[j] < list[min])
			{
				min = j;
			}
		}
		std::swap(list[i], list[min]);
	}
}

int main()
{
	int a[] = { 4,2,8,0,5,7,1,3,6,9 };

	cout << "排序前:" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << "  ";
	}
	cout << endl;

	SelectSort(a, 10);

	cout << "排序后:" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << "  ";
	}
	cout << endl;
	system("pause");

	return 0;
}

排序前:
4 2 8 0  5 7 1 3 6 9
排序后:
0 1 2 3 4 5 6 7 8 9

  选择排序算法的详细过程如下图所示。

在这里插入图片描述
  时间复杂度: 对于长度为 n n n的数组,代码执行的时间都花费在内层for循环中的比较语句和外层for循环里的交换语句了。外层for循环执行 n − 1 n-1 n1次,那么交换(swap)就执行 n − 1 n-1 n1次,时间复杂度为 O ( n ) O(n) O(n);内层for循环中的比较语句执行次数为 ( n − 1 ) + ( n − 2 ) + … + 2 + 1 = n ( n − 1 ) 2 = 1 2 n 2 − 1 2 n (n-1) + (n-2) +…+2+1=\frac{n(n-1)}{2}=\frac{1}{2}n^{2}-\frac{1}{2}n (n1)+(n2)++2+1=2n(n1)=21n221n,时间复杂度为 O ( n 2 ) O(n^2) O(n2)。所以,选择排序算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

  空间复杂度: O ( 1 ) O(1) O(1)

  稳定性: 由于选择元素之后会发生交换操作,有可能把前面的元素交换到后面,所以选择排序不是稳定的排序,如下图所示。

在这里插入图片描述

;