1. 程式人生 > >含有n個元素的整型陣列,將這個n個元素重新組合,求出最小的數,如{321,3,32},最小的數為 321323

含有n個元素的整型陣列,將這個n個元素重新組合,求出最小的數,如{321,3,32},最小的數為 321323

優酷2014年筆試題 題目:含有n個元素的整型陣列,將這個n個元素重新組合,求出最小的數,如{321,3,32},最小的數為   321323

下面的程式碼 複雜度為 o(n²);因為用了選擇排序 如果想進一步提高 可以快速排序(注意下面程式碼 交換時的if條件)

證明:假設有 s1=a    與   s2=ab   (b!=a)          兩個字串  

若 b>a則若想求最小值(eg:”1“     ”12“) 則結果必為aab 

即:s2的 b與s1的a做了比較得到的結果

b<a時同樣也是以S2的b與s1的a做了比較

a並不特指一個字元 可以是   ("defgh")與("defghb")

b也並不特指一個字元 eg      s1="1212121",s2="12"

則 a為"12",b為"12121"  此時再用 b="12121"與a="12"逐一比較  但a的長度比b小  則此時 應該把  a當作b  把 b當作a    

由上: b="12121"與a="12"   a與b做交換

得:a1="12",b1="121"   得到匹配的部分 “12“  再次重複剛才的轉換  最後會得到結果

比較函式:

int BFC(char *a,char *b){//返回a>b  
    int i=0,j=0;  
    while(a[i]||b[j]){  
        if(a[i]&&!b[j])j=0;  
        else if(!a[i]&&b[j])i=0;  
        else if(a[i]==b[j])  
        {  
            i++;  
            j++;  
        }  
        else    break;  
    }  
    return a[i]>b[j];  //如要是求最大組 改為return a[i]<b[j];即可  
}  

程式碼:

# include <stdio.h>
# define L 10
# define H  100                      //H為輸入數的上限
int gainchar(char *A,int min,int max);//長度在[min,max]  <閉區間>  之間時 函式結束 返回字串A的長度
int BFC(char *a,char *b);  //a>b 返回1 b>a 返回0
void paixu(char *p[],int n); //選擇排序對p進行排序
int jianyan(char a[]);//檢驗a陣列是否全為數字 是則返回0
int main(){
    char A[H][L+1],*p[H];
    int i,n;
    do{
        do{
            printf("請輸入要輸入的數字個數:<2,%d>",H);
            scanf("%d",&n);
            while(getchar()!='\n');
        }while(n<2||n>H);
        for(i=0;i<n;i++)
            do{
                printf("輸入第%d個數(1--%d)位:",i+1,L);
                gainchar(A[i],1,L);
                p[i]=A[i];
            }while(jianyan(A[i]));
            paixu(p,n);
            for(i=0;i<n;i++)
                printf("%s",p[i]);
            printf("\n");
    }while(1);
}
int gainchar(char *A,int min,int max)//長度在[min,max]  <閉區間>  之間時 函式結束 返回字串A的長度
{
    int B,C;
 do{
        A[max]=B=C=0;
        while((A[B++]=getchar())!='\n'&&B<max);
        if(A[B-1]!='\n')while(getchar()!='\n'&&++C);
        else A[--B]=0;
        if(C||B&&B<min)
           printf("您錄入的字串長度:%d位元組\n只錄入(%d--%d)個位元組!\n",B+C,min,max);
    }while(C||B<min);
    return B;
}
int BFC(char *a,char *b){//返回a>b
    int i=0,j=0;
     while(a[i]||b[j]){
        if(a[i]&&!b[j])j=0;
        else if(!a[i]&&b[j])i=0;
        else if(a[i]==b[j])
        {
            i++;
            j++;
        }
        else    break;
    }
    return a[i]>b[j]; //如要是球最大組 改為return a[i]<b[j];即可
}
void paixu(char *p[],int n)//對指向字串的指標拍序 省去字串交換的時間
{
    int i,j,k;
    char *q;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(BFC(p[k],p[j]))
                k=j;
            if(k!=i)
            {//修改指標即可
                q=p[k];
                p[k]=p[i];
                p[i]=q;
            }
    }
}
int jianyan(char a[])
{
    int i=-1;
    while(a[++i])
        if(a[i]<'0'||a[i]>'9')
        return printf("輸入的數字不合法!請重新");
    return 0;
}

_________________

# include <stdio.h>  
# define L 10                        //L為輸入的數的位的上限 當前為10位
# define H  100                      //H為輸入數的個數上限  
int BFC(char *a,char *b,int F);      //F?a[i]>b[j]:a[i]<b[j];
void Dsort(char *tree[],int n);      //對p進行排序  
char A[H][L+1],*p[H]; 
int main(){   
    int i,n;  
    while(~scanf("%d ",&n))
	{
	    for(i=0;i<n;p[i]=A[i],i++)
			scanf("%s",A[i]);
        Dsort(p,n);
        for(i=0;i<n;i++)  
                printf("%s",p[i]);  
        printf("\n");  
	} 
}  
int BFC(char *a,char *b,int F){  
    int i=0,j=0;  
     while(a[i]||b[j]){  
        if(a[i]&&!b[j])j=0;  
        else if(!a[i]&&b[j])i=0;  
        else if(a[i]==b[j])  
        {  
            i++;  
            j++;  
        }  
        else    break;  
    }  
	 return F?a[i]>b[j]:a[i]<b[j]; //如要是球最大組 改為return a[i]<b[j];即可  
}  
void Dsort(char *tree[],int n)//堆排序
{
    int i,j=1,LL;
	char *R;
    tree--;
    while((i=++j)<=n)
    {
        R=tree[i];
        while(i>1)
        {
            LL=(i>>1);
			if(BFC(tree[LL],R,1))break;
            tree[i]=tree[LL];
            i=LL;
        }
        tree[i]=R;
    }
    while(n)
    {
        R=tree[n];
        tree[n--]=tree[1];
        i=1;
        LL=2;
        while(LL<=n)
        {
            if(LL<n&&BFC(tree[LL+1],tree[LL],1))LL++;
            if(BFC(tree[LL],R,0))break;
            tree[i]=tree[LL];
            i=LL;
            LL<<=1;
        }
        tree[i]=R;
    }
    tree++;
}