A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© agelessman 中级黑马   /  2014-3-27 09:16  /  1132 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 agelessman 于 2014-3-27 11:20 编辑

哪位大神能给讲讲c语言排序,最好能详细点,

3 个回复

倒序浏览
c中的排序方法比较多,其它不是很了解,一般用一下两种:
冒泡法
/* 冒泡排序法 */
void Bublesort(int a[],int n)
{
     int i,j,k;
     for(j=0;j<n;j++)   /* 气泡法要排序n次*/
     {
          for(i=0;i<n-j;i++)  /* 值比较大的元素沉下去后,只把剩下的元

素中的最大值再沉下去就可以啦 */
          {
               if(a[i]>a[i+1])  /* 把值比较大的元素沉到底 */
               {
                    k=a[i];
                    a[i]=a[i+1];
                    a[i+1]=k;
               }
          }
     }
}
选择排序法
/*算法原理:首先以一个元素为基准,从一个方向开始扫描,
  比如从左至右扫描,以A[0]为基准。接下来从A[0]...A[9]
  中找出最小的元素,将其与A[0]交换。然后将基准位置右
  移一位,重复上面的动作,比如,以A[1]为基准,找出
  A[1]~A[9]中最小的,将其与A[1]交换。一直进行到基准位
  置移到数组最后一个元素时排序结束(此时基准左边所有元素
  均递增有序,而基准为最后一个元素,故完成排序)。
*/
void Selectsort(int A[],int n)
{
     int i,j,min,temp;
     for(i=0;i<n;i++)
     {
          min=i;
          for(j=i+1;j<=n;j++)  /* 从j往前的数据都是排好的,所以从j开始

往下找剩下的元素中最小的 */
          {
               if(A[min]>A[j])  /* 把剩下元素中最小的那个放到A[i]中 */
               {
                temp=A[i];
                A[i]=A[j];
                A[j]=temp;
               }
          }
    }
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 程浩 于 2014-3-27 10:09 编辑

常用的有冒泡 ,选择,快速,插入
参考:15种排序效率直观
冒泡,选择,插入,时间复杂度都是O(n2)—-n的平方
快速时间复杂度是 :O( logn)
http://static.youku.com/v1.0.0418/v/swf/loader.swf?VideoIDS=XNTkwNzI5OTIw&embedid=MjIzLjIxLjIwMi4yMDUCMTQ3NjgyNDgwAnd3dy5ndW9rci5jb20CL3Bvc3QvNDgyNjY2Lw%3D%3D&wd=&vext=pid%3D%26emb%3DMjIzLjIxLjIwMi4yMDUCMTQ3NjgyNDgwAnd3dy5ndW9rci5jb20CL3Bvc3QvNDgyNjY2Lw%3D%3D%26bc%3D%26type%3D0
  1. (1)“冒泡法”
  2. 从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:

  3. void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/
  4. {
  5.         int i,j,temp;
  6.         for(i=0;i<n-1;i++)
  7.         for(j=i+1;j<n;j++) /*注意循环的上下限*/
  8.         if(a[i]>a[j]) {
  9.                 temp=a[i];
  10.                 a[i]=a[j];
  11.                 a[j]=temp;
  12.         }
  13. }
  14. 冒泡法原理简单,但其缺点是交换次数多,效率低。

  15. 下面介绍一种源自冒泡法但更有效率的方法“选择法”。

  16. (2)“选择法”

  17. 选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。
  18. void choise(int *a,int n)
  19. {
  20.         int i,j,k,temp;
  21.         for(i=0;i<n-1;i++) {
  22.                 k=i; /*给记号赋值*/
  23.                 for(j=i+1;j<n;j++)
  24.                         if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/
  25.                         if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/
  26.                         temp=a[i];
  27.                         a[i]=a[k];
  28.                         a[k]=temp;
  29.                 }
  30.         }
  31. }
  32. 选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。
  33. (3)“快速法”
  34. 快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j).
  35. 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。
  36. 然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:

  37. void quick(int *a,int i,int j)
  38. {
  39.         int m,n,temp;
  40.         int k;
  41.         m=i;
  42.         n=j;
  43.         k=a[(i+j)/2]; /*选取的参照*/
  44.         do {
  45.                 while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/
  46.                 while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/
  47.                 if(m<=n) { /*若找到且满足条件,则交换*/
  48.                         temp=a[m];
  49.                         a[m]=a[n];
  50.                         a[n]=temp;
  51.                         m++;
  52.                         n--;
  53.                 }
  54.         }while(m<=n);
  55.         if(m<j) quick(a,m,j); /*运用递归*/
  56.         if(n>i) quick(a,i,n);
  57. }

  58. (4)“插入法”

  59. 插入法是一种比较直观的排序方法。
  60. 它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。
  61. 把数组元素插完也就完成了排序。

  62. void insert(int *a,int n)
  63. {
  64.         int i,j,temp;
  65.         for(i=1;i<n;i++) {
  66.                 temp=a[i]; /*temp为要插入的元素*/
  67.                 j=i-1;
  68.                 while(j>=0&&temp<a[j]) { /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/
  69.                         a[j+1]=a[j];
  70.                         j--;
  71.                 }
  72.                 a[j+1]=temp; /*插入*/
  73.         }
  74. }
复制代码





评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
程浩 发表于 2014-3-27 10:04
常用的有冒泡 ,选择,快速,插入
参考:15种排序效率直观
冒泡,选择,插入,时间复杂度都是O(n2)—-n的平 ...

哇塞··学习了。。。我一直都知掌握冒泡法。。。没搞过别的。。。看来得多了解才行啊··
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马