zoukankan      html  css  js  c++  java
  • 算法分析第四次作业

    1. 问题

    n个不同的数构成的数组A[1..n]进行排序,其中n=2^k;

    2. 解析

    3. 设计

        (1) 将待排序序列从中间一分为二,对左右两边再进行递归分割操作,得到n个相互独立的子序列;

        (2) n个独立的子序列递归的执行合并操作,最终得到有序的序列

    4. 分析

       

    k=lognW(1)=0带入得出复杂度为nlogn

    5. 源码

        https://github.com/Tinkerllt/algorithm-work.git

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<bitset>
     7 #include<set>
     8 #include<deque>
     9 #include<queue>
    10 #include<vector>
    11 //#include<unordered_map>
    12 #include<map>
    13 #include<stack>
    14 using namespace std;
    15 #define ll long long
    16 #define ull unsigned long long
    17 #define pii pair<int,int>
    18 #define Pii pair<ll,ll>
    19 #define m_p make_pair
    20 #define l_b lower_bound
    21 #define u_b upper_bound 
    22 const int inf=0x3f3f3f3f;
    23 const ll linf=0x3f3f3f3f3f3f3f3f;
    24 const int maxn=3e5+11;
    25 const int maxm=2e3+11;
    26 const int mod=1e9+7; 
    27 const double eps=1e-5;
    28 ll rd(){ll x = 0, f = 1; char ch = getchar();while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }while (ch >= '0'&&ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }return x * f;}
    29 inline ll qpow(ll a,ll b,ll p){ll res=1;while(b){if(b&1){res*=a;res%=p;}b>>=1;a=a*a%p;}return res;}
    30 inline ll gcd(ll a,ll b){if(b==0) return a;return gcd(b,a%b);}
    31 //iterator 
    32 //head
    33 //priority_queue
    34 void merge(int *data,int start,int end,int *result)
    35 {
    36     int left_length = (end - start + 1) / 2 + 1;//左部分区间的数据元素的个数
    37     int left_index = start;
    38     int right_index = start + left_length;
    39     int result_index = start;
    40     while(left_index < start + left_length && right_index < end+1)
    41     {
    42         //对分别已经排好序的左区间和右区间进行合并
    43         if(data[left_index] <= data[right_index])
    44             result[result_index++] = data[left_index++];
    45         else
    46             result[result_index++] = data[right_index++];
    47     }
    48     while(left_index < start + left_length)
    49         result[result_index++] = data[left_index++];
    50     while(right_index < end+1)
    51         result[result_index++] = data[right_index++];
    52 }
    53 void merge_sort(int *data, int start, int end, int *result)
    54 {
    55     if(1 == end - start)//如果区间中只有两个元素,则对这两个元素进行排序
    56     {
    57         if(data[start] > data[end])
    58         {
    59             int temp  = data[start];
    60             data[start] = data[end];
    61             data[end] = temp;
    62         }
    63         return;
    64     }
    65     else if(0 == end - start)//如果只有一个元素,则不用排序
    66         return;
    67     else
    68     {
    69         //继续划分子区间,分别对左右子区间进行排序
    70         merge_sort(data,start,(end-start+1)/2+start,result);
    71         merge_sort(data,(end-start+1)/2+start+1,end,result);
    72         //开始归并已经排好序的start到end之间的数据
    73         merge(data,start,end,result);
    74         //把排序后的区间数据复制到原始数据中去
    75         for(int i = start;i <= end;++i)
    76             data[i] = result[i];
    77     }
    78 }
    79 int main(){
    80     //std::ios::sync_with_stdio(false);
    81     int n=rd();
    82     int data[100];
    83     int result[100];
    84     for(int i=0;i<n;i++){
    85         data[i]=rd();
    86     }
    87     cout << "Before sorted:" << endl;
    88     for(int i = 0;i < n;++i)
    89         cout << data[i] << "  ";
    90     cout << endl;
    91     cout << "After sorted:" << endl;
    92     merge_sort(data,0,n-1,result);
    93     for(int i = 0;i < n;++i)
    94         cout << data[i] << "  ";
    95     cout << endl;
    96 }
    View Code
  • 相关阅读:
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之六 多点触控
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之九 定位
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之五 保存数据的几种方式
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据
    ADOBE FLASH BUILDER 4.6 IOS 开发之部署与调试
    [译] 高性能JavaScript 1至5章总结
    页签及盒子的web标准实现
  • 原文地址:https://www.cnblogs.com/tinkerx/p/12558541.html
Copyright © 2011-2022 走看看