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->

 

posted @ 2010-05-06 18:06  哭过的天空  阅读(4478)  评论(1编辑  收藏  举报