含有n個元素的整型陣列,將這個n個元素重新組合,求出最小的數,如{321,3,32},最小的數為 321323
阿新 • • 發佈:2019-02-05
優酷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++;
}