C# 选择排序
基本思想
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是稳定的排序方法。
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少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
C# 选择排序代码
/// <summary>
/// selection sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="left"></param>
/// <param name="right"></param>
public static void SelectionSort<T>(T[] array) where T : IComparable
{
int length = array.Length;
for (int i = 0; i < length; i++)
{
T min = array[i];
int minIndex = i ;
for (int j = i+1; j < length; j++)
{
if (min.CompareTo(array[j])>0)
{
min = array[j];
minIndex = j;
}
}
if (minIndex != i)
{
array[minIndex] = array[i];
array[i] = min;
//Console.WriteLine("the min value is : {2} swap {0} with {1}", array[minIndex], array[i],min);
}
//for (int k = 0; k <=i; k++)
//{
// Console.Write(array[k] + "->");
//}
//Console.WriteLine();
//Console.WriteLine();
}
}
测试代码:
int[] array = new int[] {43,23,80,15,789,27,90,69,66,158,45,32,1,22,77,66,44};
Console.WriteLine("before selection sort");
foreach (int i in array)
{
Console.Write(i+"->");
}
Console.WriteLine();
SortHelper.SelectionSort<int>(array);
Console.WriteLine("after selection sort");
foreach (int i in array)
{
Console.Write(i + "->");
}
Console.WriteLine();
Console.Read();
测试结果:
before selection sort
43->23->80->15->789->27->90->69->66->158->45->32->1->22->77->66->44->
the min value is : 1 swap 43 with 1
1->
the min value is : 15 swap 23 with 15
1->15->
the min value is : 22 swap 80 with 22
1->15->22->
1->15->22->23->
the min value is : 27 swap 789 with 27
1->15->22->23->27->
the min value is : 32 swap 789 with 32
1->15->22->23->27->32->
the min value is : 43 swap 90 with 43
1->15->22->23->27->32->43->
the min value is : 44 swap 69 with 44
1->15->22->23->27->32->43->44->
the min value is : 45 swap 66 with 45
1->15->22->23->27->32->43->44->45->
the min value is : 66 swap 158 with 66
1->15->22->23->27->32->43->44->45->66->
the min value is : 66 swap 158 with 66
1->15->22->23->27->32->43->44->45->66->66->
the min value is : 69 swap 789 with 69
1->15->22->23->27->32->43->44->45->66->66->69->
the min value is : 77 swap 90 with 77
1->15->22->23->27->32->43->44->45->66->66->69->77->
1->15->22->23->27->32->43->44->45->66->66->69->77->80->
1->15->22->23->27->32->43->44->45->66->66->69->77->80->90->
1->15->22->23->27->32->43->44->45->66->66->69->77->80->90->158->
1->15->22->23->27->32->43->44->45->66->66->69->77->80->90->158->789->
after selection sort
1->15->22->23->27->32->43->44->45->66->66->69->77->80->90->158->789->