(一)基本思想
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。
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 [49 97 65 76]
第五趟排序后13 27 38 49 49 [97 65 76]
第六趟排序后13 27 38 49 49 65 [97 76]
第七趟排序后13 27 38 49 49 76 [97 76]
最后排序结果13 27 38 49 49 76 76 97
(二)C语言过程
void selectionSort(Type* arr,long len)
{
long i=0,j=0;/*iterator value*/
long maxPos;
assertF(arr!=NULL,"In InsertSort sort,arr is NULL\n");
for(i=len-1;i>=1;i--)
{
maxPos=i;
for(j=0;j<i;j++)
if(arr[maxPos]<arr[j])maxPos=j;
if(maxPos!=i)swapArrData(arr,maxPos,i);
}
}
选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换.
(三)Pascal语言过程
procedure ssort(a:array of integer);{a为元素数组}
var
i,j,k,temp:integer;
for i:=n downto 2 do{共n-1轮选择}
begin
k:=1;
for j:=1 to i do
if a[j]>a[k] then k:=j;{第i轮,记录前i个数中最大的}
temp:=a[k];{把最大的与倒数第i个交换}
a[k]:=a[j];
a[j]:=temp;
end;
end;
(四)JA V A语言过程
public class Test {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组public static void main(String args[]) {
int i; // 循环计数变量
int Index = a.length;// 数据索引变量
System.out.print("排序前: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s", a);
System.out.println("");
SelectSort(Index - 1); // 选择排序
// 排序后结果
System.out.print("排序后: ");
for (i = 0; i < Index - 1; i++)
System.out.printf("%3s", a);
System.out.println("");
}
public static void SelectSort(int Index) {
int i, j, k; // 循环计数变量
int MinV alue; // 最小值变量
int IndexMin; // 最小值索引变量
int Temp; // 暂存变量
for (i = 0; i < Index - 1; i++) {
MinValue = 32767; // 目前最小数值
IndexMin = 0; // 储存最小数值的索引值
for (j = i; j < Index; j++) {
if (a[j] < MinValue) // 找到最小值
{
MinValue = a[j]; // 储存最小值
IndexMin = j;
}
Temp = a; // 交换两数值
a = a;
a = Temp;
}
System.out.print("排序中: ");
for (k = 0; k < Index; k++)
System.out.printf("%3s", a[k]);
System.out.println("");
}
}
}
(五)visual basic语言过程
Private Sub switch(ByRef a, ByRef b)
Dim c As Integer
c = a
a = b
b = c
End Sub
-----------------------------------------------
Private Sub Command1_Click()
Dim i, j As Integer
Dim a As Variant
a = Array(12, 25, 58, 45, 33, 24) '举个例子
For i = 0 To UBound(a) - 1
For j = i + 1 To UBound(a)
If a(i) > a(j) Then
Call switch(a(i), a(j))
End If
Next j
Next i
For i = 0 To 5
Print a(i)
Next i
End Sub
(六)C#语言过程
public static void ssort(int[] list)
{
int i, j, min, temp;
for (i = 0; i < list.Length - 1; i++)
{
min = i;
for (j = i + 1; j < list.Length; j++)
{
if (list[j] < list[min])
min = j;
}
temp = list[i];
list[i] = list[min];
list[min] = temp;
//调用排序过程
static void Main(string[] args)
{
int[] arrlist = new int[] { 49, 38, 65, 97, 76, 13, 27, 49 };
ssort(arrlist);
for (int n = 0; n < arrlist.Length; n++)
{
Console.Write("{0}",arrlist[n]+" "); }
Console.WriteLine();
}。