• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Ada_gf
勇敢的人不是不流泪的人,而是含着泪继续奔跑的人。
博客园    首页    新随笔    联系   管理    订阅  订阅
分治

分治

简单而言就是分而治之!

一、fen(   ):先把一组数组不断对半分开,直到每一份都只有一个数为止。

如下图:                  

                5    2     6      1      4      3      7

            ↓               sort                  ↓

                   5  2  6  1                            4  3  7

              ↓   sort   ↓                           ↓    sort  ↓

                  5   2       6   1                    4   3          7

          ↓  sort    ↓         ↓ sort ↓                 ↓  sort   ↓      

        5         2     6          1              4            3    

 ♥

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   

       

二、he(  ):把它们处理好后再合并。

如下图(从小到大排序):

        5         2      6         1           4         3           7

          ↓ merge ↓      ↓ merge ↓               ↓merge↓            ↓

            2    5         1    6                 3    4           7

               ↓       merge        ↓                        ↓      merge    ↓

                    1  2  5  6                              3  4  7

                          ↓                merge                   ↓

                       1      2      3      4       5      6      7 

 

 一道经典例题 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

有 n 个数,把它们从小到大排序后输出。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - -

代码:

#include <bits/stdc++.h> //未完善
using namespace std;
int n,a[100000],tmp[1000000];

void he(int tmp[],int l,int r){
int mid=(l+r)/2;
int leftStart=l,leftEnd=mid;
int rightStart=mid+1,rightEnd=r;
int cpos=l;
while(leftStart<=leftEnd && rightStart<=rightEnd){
if(a[leftStart]<=rightStart){
tmp[cpos++]=a[leftStart++];
//cout<<tmp[cpos]<<" ";
}
else{
tmp[cpos++]=a[rightStart++];
//cout<<cpos<<" ";
}
}
while(leftStart<=leftEnd){
tmp[cpos++]=a[leftStart++];
//cout<<tmp[cpos]<<" ";
}
while(rightStart<=rightEnd){
tmp[cpos++]=a[rightStart++];
//cout<<tmp[cpos]<<" ";
}
for (int i=l;i<=r;i++){
a[i]=tmp[i];
}
}

 

void fen(int tmp[],int l,int r){
if(l!=r){
int mid=(l+r)/2;
for (int i=l;i<=r;i++){
cout<<a[i]<<" ";
}
cout<<endl;
fen(tmp,l,mid);
fen(tmp,mid+1,r);
he(tmp,l,r);
}
}

 

int main (){
cin>>n;
for (int i=1;i<=n;i++)cin>>a[i];
fen(tmp,1,n);
for (int i=1;i<=n;i++)cout<<a[i]<<" ";
}

 

         

 

    

posted on 2019-01-23 10:35  LXY-流星雨  阅读(179)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3