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
  • 相关阅读:
    Android学习八---OpenCV JAVA API
    Android学习七---Hello OpenCV samples
    Android学习六---OpenCV for android samples
    android学习五---OpenCV for android环境搭建
    android学习四---Activity和Intent
    Servlet总结(Zpoor,你还说你不会Servlet?)
    Eclipse使用小技巧
    Java-List(冷静分析,稍加思索,识破)
    JDBC——setting useSSL=false, or set useSSL=true
    Java-foreach分析总结
  • 原文地址:https://www.cnblogs.com/tinkerx/p/12558541.html
Copyright © 2011-2022 走看看