回 帖 发 新 帖 刷新版面

主题:分享个排序算法...........

#include<stdio.h>
#include<stdlib.h>
#define n 18
void main()
{
    bool bIEvennumber=false;//元素个数是否偶数
    int A[n]={3,1,5,4,7,9,8,6,10,2,12,11,14,13,16,15,18,17};
    int max,min,i,j,d,c;
    printf("原数组为:      ");

    for(i=0;i<n;i++)
    printf("%d ",A[i]);
    printf("\n");
    
    if(n%2==0)
        bIEvennumber=true;
    for(i=0;i<n/2;i++)  //
    {
        
        max=min=A[i];
        c=d=i;
      for(j=i+1;j<n-i;j++)
      {
         
        if(A[j]>=max)
        {
            max=A[j];
            c=j;
            
        }
        else if(A[j]<=min)
        {
            min=A[j];    
            d=j;
        }
      }
       if(j-i<=2)
           break;
       //较小值放前面
       A[d]=A[i];
       A[i]=min;
       //较大值放后面
       if(c!=i)
       {
         A[c]=A[j-1];
         A[j-1]=max;
       }
       else
       {
         max=A[j-1]; 
                     //此处max被用做中间变量不用担心影响到它本来的作用
         A[j-1]=A[d];
         A[d]=max;
       }
       
              
    }


    if(bIEvennumber&&A[i]>A[i+1])
    {
        int temp;
        temp=A[i+1];
        A[i+1]=A[i];
        A[i]=temp;
    }

    printf("调整后的数组为:");
    for(i=0;i<n;i++)
        printf("%d ",A[i]);
      printf("\n ");
    return;
}

回复列表 (共22个回复)

11 楼

再度小的改进:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define n 17
void main()
{
    
    int A[n];
    int max,min,i,j,d,c;

    srand( (unsigned)time( NULL ) );
    for(i=0;i<n;i++)
           A[i]=rand()/50;//产生随机数
    printf("原数组为:      ");

    for(i=0;i<n;i++)
    printf("%d ",A[i]);
    printf("\n");
    
    
    for(i=0;i<n/2;i++)  
    {
        
        max=min=A[i];
        c=d=i;
      for(j=i+1;j<n-i;j++)
      {
         
        if(A[j]>=max)
        {
            max=A[j];
            c=j;
            
        }
        else if(A[j]<=min)
        {
            min=A[j];    
            d=j;
        }
      }
       if(j-i<=1)    //更改过,原来是if(j-i<=2)
              break;
       //较小值放前面
       A[d]=A[i];
       A[i]=min;
       //较大值放后面
       if(c!=i)
       {
         A[c]=A[j-1];
         A[j-1]=max;
       }
       else
       {
         max=A[j-1]; 
                         //此处max被用做中间变量不用担心影响到它本来的作用
         A[j-1]=A[d];
         A[d]=max;
       }
       
              
    }


    /*if(A[i]>A[i+1]) //去掉这里
    {
        int temp;
        temp=A[i+1];
        A[i+1]=A[i];
        A[i]=temp;
    }*/

    printf("调整后的数组为:");
    for(i=0;i<n;i++)
        printf("%d ",A[i]);
      printf("\n ");
    return;

12 楼


你想争钱吗?我的视频店铺开张了,免费视频招聘,免费视频求职,免费视频简历,免费视频店铺,网上做生意 尽在我财网- www.51ccb.com 可以和店主进行讨价还价的网上视频店铺www.51ccb.com
 可以直接面对顾客,就象在贸易市场上开店那样,可以和顾客直接切磋,进行讨价还价,让网上的买卖回归现实,这一切就发生在www.51ccb.com,而且在这个网站开店永远是免费的,视频应聘软件下载
一个很好用的视频聊天,视频招聘,视频应聘软件 ,下载地址:http://www.51ccb.com/download/ccb2006_setup.exe 
只要你下载好这个软件你的梦想将在www.51ccb.com实现!!快快加入吧!! 
  

13 楼


这种算法代码数量跟气泡排序相比多了一倍啊!!!

14 楼

单向双向~时间复杂度差不多啊

15 楼

时间频度(执行次数)可低多了,在n不是很大时比其他一般算法较有效.............

16 楼

顶一顶,好样的
想法不错,但好像时间复杂度和空间复杂度不是很理想
还是要顶一顶

17 楼

不明白这里;A[j-1]是每次比较的最后一个元素,不是A[j]是每次比较序列的最后一个元素么?

18 楼

现在明白了,谢谢楼主!

19 楼

学习一下

20 楼

此算法在《数据结构》练习题中有出现   ,楼主想法不错   ,望继续努力

我来回复

您尚未登录,请登录后再回复。点此登录或注册