选择排序算法

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

一、基本思想:

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

三、代码示例

选择排序
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、排序稳定性

直接选择排序是不稳定的

posted on 2011-05-24 18:13  程序媛蒲苇  阅读(475)  评论(0编辑  收藏  举报

导航