把数组排成最小的数(66)

本文介绍了一种通过快速排序算法解决数组排序问题的方法,目的是将输入的正整数数组连接成一个最小的数字。通过自定义字符串比较函数,实现了一个特殊的快速排序过程,最终输出按特定规则排序后的数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

68.把数组排成最小的数。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32,  321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
分析:这是09年6月份百度的一道面试题,
从这道题我们可以看出百度对应聘者在算法方面有很高的要求。


/*
  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;
}

是一个快速排序算法,比较操作采用符号重载的方式,这个题目还是比较有意思的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值