(一)基本思想
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。
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
if(arr[maxPos] 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(); }