每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
  选择排序是不稳定的排序方法。
  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;
  begin
  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;
posted on 2009-04-08 13:41  AlexusLi  阅读(243)  评论(1编辑  收藏  举报