每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
一、基本思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
1、初始状态
无序区为R[1…n],有序区为空
2、第1趟排序
在无序区R[1…n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1…1]和R[2…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
3、第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1…i-1]和R[i…n](1<=i<=n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1…i]和R[i+1…n]分别变为记录个数增加一个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。二、排序过程
初始关键字 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [76 97 65 49 ]
第五趟排序后 13 27 38 49 49 [97 65 76]
第六趟排序后 13 27 38 49 49 65 [97 76]
第七趟排序后 13 27 38 49 49 65 76 [97]
最后排序结果 13 27 38 49 49 65 76 97
三、代码示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
namespace SelectSortService
{
public class SelectSortService
{
static void Main(string[] args)
{
// 判断参数
int argsLength = args.Length;
if (argsLength == 0)
{
Console.WriteLine("请输入参数!");
return;
}
int arg;
int[] sortArray = new int[argsLength];
for (int i = 0;i < argsLength; i++)
{
if (!int.TryParse(args[i], out arg))
{
Console.WriteLine("参数必须全都为数字!");
return;
}
sortArray[i] = arg;
}
// 排序
SelectSortService select = new SelectSortService();
sortArray = select.SelectSort(sortArray);
}
/// <summary>
/// 选择排序算法
/// </summary>
/// <param name="arr">数字数组</param>
/// <returns>排好序的数字数组</returns>
public int[] SelectSort(int[] arr)
{
int k, temp;
for (int i = 0; i < arr.Length - 1; i++)
{
k = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[k] > arr[j])
{
k = j;
}
}
if (k != i)
{
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
Console.WriteLine("");
foreach (var item in arr)
{
Console.Write(item + " ");
}
}
return arr;
}
}
}
运行结果:
四、算法分析
1、时间复杂度
A、记录比较次数
无论待排序数组初始状态如何,都要进行n-1趟选择排序:
第1趟:比较n-1次
第2趟:比较n-2次
……
第n-1趟,比较1次
从而:总共的比较次数为1+2+…+(n-1)=n(n-1)/2
B、记录移动次数
如果待排序数组为正序,则记录不需要交换,记录移动次数为0
如果当排序数组为逆序,则:
第1趟:交换1次,移动3次;
第2趟:交换1次,移动3次;
……
第n-1趟:交换1次,移动3次。
从而,总共的移动次数为:3(n-1)
因此,时间复杂度为O(n2);
2、空间复杂度
在选择排序的过程中,设置一个变量用来交换元素,所以空间复杂度为O(1)
3、排序稳定性
直接选择排序是不稳定的