美文网首页
2020-05-14

2020-05-14

作者: V_6619 | 来源:发表于2020-05-14 23:08 被阅读0次

    模拟栈

    #include <iostream>
     using namespace std;
    
    const int N = 100010;
    int stk[N], tt;
    
     int main()
     {
         int n; 
         cin>>n;
         while(n--)
         {
             string op;
             int a;
             cin>>op;
             if(op == "push")
             {
                 cin>>a;
                 stk[++ tt] = a;
             }
             else if(op == "pop")
             {
                 tt --;
             }
             else if(op == "query")
             {
                 cout<<stk[tt]<<endl;
             }
    
             else
             {
                 if(tt == 0) puts("YES");
                 else puts("NO");
             }
         }
     }
    

    模拟队列

    #include <iostream>
    // #include <cstring>
     using namespace std;
     
    const int N = 1000010;
    int q[N], hh, tt = -1; 
    
     int main()
     {
         int n;
         cin>>n;
         while(n--)
         {
             string op;
             cin>>op;
             if(op == "push")
             {
                 int a;
                 cin>>a;
                 q[++ tt] = a; 
             }
             
             else if(op == "empty")
             {
                 if(tt < hh) puts("YES");
                 else puts("NO");
             }
             
             else if(op == "query")
             {
                 cout<<q[hh]<<endl;
             }
             
             else
             {
                 hh ++;
             }
         }
     }
    

    冒泡排序

    void bubble_sort()  //冒泡排序
    {
        // for(int i = n - 1; i >= 0; i--) //把最大的往下沉
        // {    
        //     bool flag = false;
        //     for(int j = 0; j < i; j++)
        //         if(a[j] > a[j+1])
        //         {    swap(a[j], a[j+1]); 
        //             flag = true; } 
        //     if(!flag) break; //优化
        // }
        for(int i = 0; i < n; i++)
        {
            bool flag = false;
            for(int j = n-1; j >= i; j--)   //最小的从底网上冒
                if(a[j-1] > a[j])
                {    swap(a[j-1], a[j]);
                    flag = true;}
            if(!flag) break;
        }
    }
    

    选择排序

    void select_sort()  //选择排序
    {
        for(int i = 0; i < n; i++)  
        {
            int k = i;
            for(int j = i+1; j < n; j++)  
                if(a[k] > a[j])
                    k = j;          //把小的选上
    
             if(i != k)  //找到了最小值
                swap(a[i], a[k]);   //每轮交换一次
        }
    }
    

    插入排序

    void insert_sort()//直接插入排序,把数插入一个已经排好序的序列
    {
        for(int i = 1; i < n; i++)
        {   
            int t = a[i], j;   //先存下来
            for(j = i-1; j >= 0; j--)
                if(a[j] > t)
                    a[j+1] = a[j];
                else break;
            a[j+1] = t;
        }
        // for(int i = 1; i < n; i++)
        // {
        //     int t = a[i], j;
        //     for(j = i-1; a[j] > t; j--)
        //         a[j+1] = a[j];  //比t大的往后放,排好序
        //     a[j+1] = t;         //把t放到 大于t的已排序的前面
        // }
    }
    

    快排

    void quick_sort(int a[], int l, int r)
    {
        if(l >= r) return;
        int i = l, j = r, mid = a[(l+r) >> 1];
    
        while(i < j)
        {
            while(a[i] < mid) i++;
            while(a[j] > mid) j--;
            if(i < j) swap(a[i], a[j]);
            // else break;
        }
        quick_sort(a, l, j); quick_sort(a, j+1, r);
    }
    
    

    归并

    void merge_sort(int a[], int l, int r)
    {
        if(l >= r) return;
        int mid = l + r >> 1;
        merge_sort(a, l, mid); 
        merge_sort(a, mid+1, r);
    
        static vector<int> tmp(r);//静态数组,调用快点
        tmp.clear(); //存放临时最小的,然后清空,tmp也可作为全局变量放外面
    
        int k = 0, i = l, j = mid+1;
        while(i <= mid && j <= r)
            if(a[i] > a[j]) 
            {
                tmp[k++] =  a[j++]; 
                res += mid-i +1; //逆序对个数
            }
            else tmp[k++] = a[i++];
    
        while(i <= mid) tmp[k++] = a[i++];
        while(j <= r) tmp[k++] = a[j++];
    
        for(int i = l, j = 0; i <= r; i++, j++) a[i] = tmp[j];
    }
    
    

    堆排序

    #include <iostream>
     using namespace std;
     const int N = 100010;
     int h[N], cnt;
    
     void down(int u)
     {
         int minn = u;
         if(u*2 <= cnt && h[u*2] < h[minn]) minn = u*2;
         if(u*2 + 1 <= cnt && h[u*2 + 1] < h[minn]) minn = u*2 + 1;
         if(minn != u)
         {
             swap(h[minn], h[u]);
             down(minn);
         }
     }
     int main()
     {
         int n,m;
         cin>>n>>m;
         for(int i=1; i <= n; i++) scanf("%d", &h[i]);
         cnt = n;
         for(int i = n/2; i >= 1; i--) down(i);
         while(m--)
         {
             cout<<h[1]<<" ";
             h[1] = h[cnt];
             cnt -= 1 ;
             down(1);
         }
    
     }
    
    

    二分求数的三次方(牛顿迭代法)

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        double x;
        cin >> x;
    
        double l = -100, r = 100;
        while (r - l > 1e-8)
        {
            double mid = (l + r) / 2;
            if (mid * mid * mid >= x) r = mid;
            else l = mid;
        }
    
        printf("%.6lf\n", l);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:2020-05-14

          本文链接:https://www.haomeiwen.com/subject/feufohtx.html