zoukankan      html  css  js  c++  java
  • Young氏矩阵类C++实现代码 算法导论6.3

    个人总结:

    1.int **p和 int a[M][N]之间的区别:

            1) int **指向指针的指针;而后者的类型是数组名,类型为 int (*)[N],即指向的是整个一行。

            2) (a+1) 表示地址增加M*sizeof(int),需要注意的一点是a[i]是第i行开头的地址,&a和a的值是一样的。数组名是附带大小属性的,而指针是一个存储了地址的变量。特意去看了一下声明数组的汇编代码,其中一条指令是mov %gs:0x14,%eax  (数组大小20即0x14),最后也貌似也会检查一下数组是否溢出,溢出的话会调用一个栈函数(不是很懂,应该是保护机制)。特别是调用sizeof(数组名)的时候,汇编代码并没有增加,就好像没有这么一个调用一样,因为数组的大小存储在栈中某个位置。

    传送参数的时候需要注意传送应该传送指针还是数组。我一开始居然以为可以这么做 int **p=a;(啊!naive!)

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    #define INT_MAX 100000
    
    class Y_Matrix{
    public:
        Y_Matrix(int rows, int cols);
        ~Y_Matrix();
        void YM_Build(int *a, int n);
        void PrintM() const;
        void Decrease_Key(int x, int y, int key);
        int Extract_Min();
        void Insert_Key(int key){
            if (y_matrix[R - 1][C - 1] != INT_MAX)
            {
                cout << "over flow"<<endl;
                return;
            }
            Decrease_Key(R - 1, C - 1, key);
        }
        void Sort(int *array, int n);
        bool Find(int elem);
        void Clear();
    private:
        const int R, C;
        int **y_matrix;
        void YM_Heapify(int x,int y);
    };
    
    Y_Matrix::Y_Matrix(int rows, int cols):R(rows),C(cols){
        y_matrix = new int *[rows];
        for (int i = 0; i < rows; ++i){
            y_matrix[i] = new int[cols];
            for (int j = 0; j < cols; ++j){
                y_matrix[i][j] = INT_MAX;
            }
        }
    }
    void Y_Matrix::Clear(){
        for (int i = 0; i < R; ++i)
            for (int j = 0; j < C; ++j)
                y_matrix[i][j] = INT_MAX;
    
    }
    void Y_Matrix::YM_Build(int *a, int n){
        int temp = min(n, R*C);
        for (int i = 0; i < temp; ++i){
            Insert_Key(a[i]);
        }
    }
    
    void Y_Matrix::YM_Heapify(int x, int y){
        int r = x, c = y;
        if (x + 1 < R&&y_matrix[r][c] > y_matrix[x + 1][y])
            ++x;
        if (y + 1 < C&&y_matrix[x][y] > y_matrix[r][c + 1])
        {
            x = r;
            ++y;
        }
        if (!(r == x&&c == y)){
            swap(y_matrix[x][y], y_matrix[r][c]);
            YM_Heapify(x, y);
        }
    }
    
    void Y_Matrix::Decrease_Key(int x, int y, int key){
        if (x > R - 1 || y > C - 1)
            return;
        if (key>y_matrix[x][y]){
            cout << "new element is bigger" << endl;
            return;
        }
        while (1){
            int r = x, c = y;
            y_matrix[x][y] = key;
            if (x > 0 && key < y_matrix[x - 1][y]){
                --x;
            }
            if (y > 0 && y_matrix[x][y] < y_matrix[r][c-1]){
                x = r;
                --y;
            }
            if (!(r == x&&c == y)){
                swap(y_matrix[x][y], y_matrix[r][c]);
            }
            else{
                y_matrix[x][y] = key;
                break;
            }
        }
    }
    int Y_Matrix::Extract_Min(){
        int temp = y_matrix[0][0];
        y_matrix[0][0] = INT_MAX;
        YM_Heapify(0, 0);
        return temp;
    }
    
    
    void Y_Matrix::Sort(int *array,int n){
        Clear();
        YM_Build(array, n);
        int k = min(n, R*C);
        for (int i = 0; i < k; ++i){
            array[i] = Extract_Min();
        }
    }
    
    bool Y_Matrix::Find(int key){
        int x = R - 1; 
        int y = 0;
        while (x >= 0 && y < C){
            if (y_matrix[x][y] > key)
                --x;
            else if (y_matrix[x][y] < key)
                ++y;
            else return true;
        }
        return false;
    }
    
    void Y_Matrix::PrintM() const {
        for (int i = 0; i < R; ++i){
            for (int j = 0; j < C; ++j)
                cout << y_matrix[i][j] << "	";
            cout << endl;
        }
        cout << endl;
    }
    Y_Matrix::~Y_Matrix(){
        for (int i = 0; i < R; ++i)
            delete[]y_matrix[i];
        delete[]y_matrix;
    }
    
    int main(){
        int a[19] = { 4, 6, 8, 2, 1, 0, 7, 4, 2, 1, 9, 5 ,1,111,2224,23,545,134,1122};
        Y_Matrix ym(5, 5);
        ym.YM_Build(a, 19);
        ym.PrintM();
        ym.Sort(a, 19);
        for (int i = 0; i < 19; ++i)
            cout << a[i] << " ";
    }
  • 相关阅读:
    apache的源代码编译安装
    python学习笔记(五) 200行实现2048小游戏
    python学习笔记(四) 思考和准备
    python学习笔记(三)高级特性
    python自学笔记(二)
    python自学笔记(一)
    redis 配置和使用(C++)
    汇编基础最后一篇--机器语言指令
    汇编语言学习笔记(六)
    网络编程学习方法和图书推荐
  • 原文地址:https://www.cnblogs.com/Nastukashii/p/4399582.html
Copyright © 2011-2022 走看看