程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 把數組排成最小的數。

把數組排成最小的數。

編輯:C++入門知識

68.把數組排成最小的數。
題目:輸入一個正整數數組,將它們連接起來排成一個數,輸出能排出的所有數字中最小的一個。
例如輸入數組{32,  321},則輸出這兩個能排成的最小數字32132。
請給出解決問題的算法,並證明該算法。
分析:這是09年6月份百度的一道面試題,
從這道題我們可以看出百度對應聘者在算法方面有很高的要求。

 

 


[cpp]
/*
  Name: 
  Copyright: 
  Author: 
  Date: 25-06-11 15:19
  Description: 把數組排成最小的數(數組、算法)。
題目:輸入一個正整數數組,將它們連接起來排成一個數,輸出能排出的所有數字中
最小的一個。
例如輸入數組{32, 321},則輸出這兩個能排成的最小數字32132。
請給出解決問題的算法,並證明該算法。
*/ 
#include<iostream>  
#include<iomanip>  
using namespace std; 
#define N 10    //總共有N個整數   
bool  cmp_min(char *s1,char *s2) 
//算法保證,s1、s2都不是空串    

   const int slen1=strlen(s1); 
   const int slen2=strlen(s2); 
   char *tc=(char *)malloc(slen1+slen2+1);//只開辟一個空間   
   int i; 
   for(i=0;i<slen2;++i) 
   tc[i]=s2[i]; 
   for(;i<slen1+slen2;++i) 
   tc[i]=s1[i-slen2]; 
   tc[i]='\0'; 
   for(i=0;i<slen1;++i) 
   { 
      if(s1[i]==tc[i]) 
      continue; 
      else 
      { 
          if(s1[i]>tc[i]) 
          return false; 
          else 
          return true; 
      } 
   } 
   for(;i<slen1+slen2;++i) 
   { 
      if(s2[i-slen1]==tc[i]) 
      continue; 
      else 
      { 
          if(s1[i-slen1]>tc[i]) 
          return false; 
          else 
          return true; 
      } 
   } 
   return false; 
}  
 
int sort_partition(char *s[],int p,int r) 

    char *x=s[r]; 
    int i=p-1; 
    int j; 
    char *tem; 
    for(j=p;j<r;++j) 
    { 
       if(cmp_min(s[j],x)) 
       { 
          tem=s[++i]; 
          s[i]=s[j]; 
          s[j]=tem; 
       } 
    } 
    tem=s[++i]; 
    s[i]=x; 
    s[r]=tem; 
    return i; 

 
void quick_sort(char *s[],int p,int r) 

     int m; 
     if(p<r) 
     { 
         m=sort_partition(s,p,r); 
         quick_sort(s,p,m-1); 
         quick_sort(s,m+1,r);     
     } 
      

int main() 

    //z總共有N個整數   
    int a[N]={123,43,565,1,67,234,9012,1056,2056,2249}; 
    char *s[N];//指針數組   
    for(int i=0;i<N;++i) 
    {//轉換為N個字符串   
      s[i]=(char *)malloc(sizeof(char)*12); 
      //一個整數用11為來表示   
      itoa(a[i],s[i],10); 
      //包含'\0'   
    } 
    for(int i=0;i<N;i++) 
    { 
       cout<<s[i]<<"  "; 
    } 
    quick_sort(s,0,9); 
    cout<<endl; 
    for(int i=0;i<N;i++) 
    { 
       cout<<s[i]<<"  "; 
    } 
    system("pause"); 
    return 0; 

/*
  Name:
  Copyright:
  Author:
  Date: 25-06-11 15:19
  Description: 把數組排成最小的數(數組、算法)。
題目:輸入一個正整數數組,將它們連接起來排成一個數,輸出能排出的所有數字中
最小的一個。
例如輸入數組{32, 321},則輸出這兩個能排成的最小數字32132。
請給出解決問題的算法,並證明該算法。
*/
#include<iostream>
#include<iomanip>
using namespace std;
#define N 10    //總共有N個整數
bool  cmp_min(char *s1,char *s2)
//算法保證,s1、s2都不是空串 
{
   const int slen1=strlen(s1);
   const int slen2=strlen(s2);
   char *tc=(char *)malloc(slen1+slen2+1);//只開辟一個空間
   int i;
   for(i=0;i<slen2;++i)
   tc[i]=s2[i];
   for(;i<slen1+slen2;++i)
   tc[i]=s1[i-slen2];
   tc[i]='\0';
   for(i=0;i<slen1;++i)
   {
      if(s1[i]==tc[i])
      continue;
      else
      {
          if(s1[i]>tc[i])
          return false;
          else
          return true;
      }
   }
   for(;i<slen1+slen2;++i)
   {
      if(s2[i-slen1]==tc[i])
      continue;
      else
      {
          if(s1[i-slen1]>tc[i])
          return false;
          else
          return true;
      }
   }
   return false;
}

int sort_partition(char *s[],int p,int r)
{
    char *x=s[r];
    int i=p-1;
    int j;
    char *tem;
    for(j=p;j<r;++j)
    {
       if(cmp_min(s[j],x))
       {
          tem=s[++i];
          s[i]=s[j];
          s[j]=tem;
       }
    }
    tem=s[++i];
    s[i]=x;
    s[r]=tem;
    return i;
}

void quick_sort(char *s[],int p,int r)
{
     int m;
     if(p<r)
     {
         m=sort_partition(s,p,r);
         quick_sort(s,p,m-1);
         quick_sort(s,m+1,r);   
     }
    
}
int main()
{
    //z總共有N個整數
    int a[N]={123,43,565,1,67,234,9012,1056,2056,2249};
    char *s[N];//指針數組
    for(int i=0;i<N;++i)
    {//轉換為N個字符串
      s[i]=(char *)malloc(sizeof(char)*12);
      //一個整數用11為來表示
      itoa(a[i],s[i],10);
      //包含'\0'
    }
    for(int i=0;i<N;i++)
    {
       cout<<s[i]<<"  ";
    }
    quick_sort(s,0,9);
    cout<<endl;
    for(int i=0;i<N;i++)
    {
       cout<<s[i]<<"  ";
    }
    system("pause");
    return 0;
}
就是一個快速排序,比較操作采用符號重載的方式,這個題目還是比較有意思的

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved