分享

C语言数组排序问题二

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

{
   int m,n,temp;
   int k;
   m = i;
   n = j;
   k = a[(m+n)/2];
   do 
   {
  while (a[m]<k&&m<j)  { m++; }
  while (a[n]>k&&n>i)  { n--;  }
  if (m<n)
  {
  temp = a[m];
  a[m] = a[n];
  a[n] = temp;
  m++;
  n--;
  }

   } while (m<n);
   
   if (m<j)  {  quick(a,m,j);   }
   
   if (n>i)  {  quick(a,i,n);   }
}
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多