数据排序(一)

数据排序是信息获取后对数据进行处理的方式之一,其方法有以下几种,我们要根据题目的要求选择适当的排序方法。

1.选择排序

(1)基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排            序的数据元素排完。

(2)程序实现方法:用两层循环完成算法,外层循环i控制当前序列最小值存放的数组位置,内层循环j控制从i+1到n序列中选择          最小的元素所在位置k。

(3)程序循环部分表达方式:

        for(int i=0;i<n;i++)

        {

            k=i;

            for(j=i+1;j<n;j++)

                if(a[j]<a[k]) k=j;

            if(k!=i)

            {

                temp=a[i];a[i]=a[k];a[k]=temp;

             }

          }

2.冒泡排序

(1)基本思想:相邻的两个数据进行比较,按题目要求决定是否需要交换位置,依次类推。排序过程中,大数慢慢地往后,相            当于气泡上升,所以叫冒泡排序。

(2)程序实现方法:用两层循环完成算法,外层循环i控制每轮要进行多少次的比较,第1轮比较n-1次,第2轮比较n-2次,                ……,最后一轮比较1次。内层循环j控制每轮i次比较相邻两个元素是否逆序,若逆序就交换这两个元素。

 (3)冒泡排序有三种表达方式:

          a. for (inti=n-1;i>=1;i--)

         {

               for ( int  j=0;j<i; j++)

               {

                     If(a[j]>a[j+1])swap(a[j],a[j+1]);

               }

          }

          b. for ( int i=1;i<=n-1;i++)

         {

                   for(int j=1;j<=n-i ; j++)

                    {

                         if(a[j]>a[j+1])

                         swap(a[j],a[j+1]);

                    }

           }

          c.(改进版)bool ok;

                    for(int i=n-1;i>=1;i--)

                    {

                          ok=true;//判断是否有交换

                          for(intj=1;j<=i;j++)

                          {

                              If(a[j]>a[j+1])

                              {

                                 swap(a[j],a[j+1]);

                                 ok=false;

                               } 

                           }

                           If(ok==true) break;//没有交换就退出

                     }

3.插入排序

(1)基本思想:这种排序的过程就像你在抓牌时对扑克牌排序一样,当抓完所有的牌时,手中的牌便是有序的,这种排序方法            即为插入排序。

(2)实现方法:当读入一个元素时,在已经排序好的序列中,搜寻它正确的位置,再放入读入的元素。但要注意:在插入这个元         素之前,应当先将它后面的所有元素后移一位,以保证插入位置的原元素不会被覆盖。

(3)实现过程:

for(inti=0;i<n;i++)

{

for(j=i-1;j>=0;j--)

if(a[j]<a[i]) break;

if(j!=i-1)

{

     temp=a[i];

    for(int k=i-1;k>j;k--)

    a[k+1]=a[k];

     a[k+1]=temp;

}

            }

4.桶排序

(1)基本思想:若待排序的值在一个明显有限范围内时,可设计有限个有序桶,待排序的值装入对应的桶,桶号就是待排序的值,     顺序输出各桶的值,将得到有序的序列。

(2)实现过程:

int b[101],n,i,j,k;

memset(b,0,sizeof(b));

cin>>n;

for(i=1;i<=n;i++)

{

   cin>>k;b[k]++;

}

for(i=0;i<=100;i++)

while(b[i]>0)

{

   cout<<i<<””;

   b[i]--;

 }

5.快速排序

(1)基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分      别对着两部分记录继续进行排序,以达到整个序列有序。

(2)实现方法:附设两个指针i和j,它们的初值分别为l和r,设枢轴记录取mid,则首先从j所指位置起向前搜索找到第一个关键字小     于mid的记录,然后从i所指位置起向后搜索,找到第一个关键字大于mid的记录,将它们互换,重复这两步直至i>j为止。

(3)实现过程:

void qsort(int l,int r)

{

int i,j,mid,p;

i=l;j=r;

mid=a[(l+r)/2];

do

{

   while(a[i]<mid) i++;

   while(a[j]>mid)  j--;

  if(i<=j)

   {

       p=a[i];a[i]=a[j];a[j]=p;

      i++;j--;

   }

 }

 while(i<=j);

 if(l<j)qsort(l,r);

 if(i<r) qsort(i,r);

  }

            int main()

            {

               int n,i;

               cin>>n;

               for(i=1;i<=n;i++)cin>>a[i];

               qsort(1,n);

               for(i=1;i<=n;i++)

               cout<<a[i]<<”“;

               cout<<endl;

            }

6.sort函数排序

(1)从小到大排序(a为数组a,k为数组a内元素的个数)

若循环内i=0,则应表示为sort(a,a+k).

若循环内i=1,则应表示为sort(a+1,a+1+k).

 (2)从大到小排序

     从大到小排序应该先定义一个函数(如下:)

         boolcomplare(int a,int b)

        {

               return a>b;

        }

         然后  sort(a,a+k,complare)

         或者  sort(a+1,a+1+k,complare)//解释如(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值