Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877405
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-08-14 11:03:34

选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
  常用的选择排序方法有直接选择排序和堆排序。

直接选择排序(Straight Selection Sort)

1、直接选择排序的基本思想

     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[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
     这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

点击(此处)折叠或打开

  1. #include

  2. void straightSelectSort(int a[],int length)//交换次数多左了,用个k记录就不用这么多
  3. {
  4.      for(int i=0;i
  5.      {
  6.          int k=i;
  7.          for(int j=i+1;j
  8.          {
  9.            if(a[j]
  10.            {
  11.               k=j;//(有交换过,k记录所有位置则k!=i)
  12.            }
  13.          }
  14.          if(i!=k)
  15.          {
  16.              int temp=a[k];
  17.              a[k]=a[i];
  18.              a[i]=temp;
  19.          }
  20.      }
  21.  }
  22. int main()
  23. {
  24.     int a[]={34,23,23,12,35,10,6,3,22,36};
  25.     straightSelectSort(a,10);
  26.     for(int i=0;i<10;i++)
  27.     printf("%d ",a[i]);
  28.     getchar();
  29.     return 0;
  30. }






阅读(777) | 评论(0) | 转发(0) |
0

上一篇:八大排序

下一篇:交换排序:冒泡与快速

给主人留下些什么吧!~~