码迷,mamicode.com
首页 > 编程语言 > 详细

Young氏矩阵实现代码(C++) 算法导论 6.3

时间:2015-04-06 14:13:14      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

个人总结:

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] << "\t";
        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] << " ";
}

 

Young氏矩阵实现代码(C++) 算法导论 6.3

标签:

原文地址:http://www.cnblogs.com/Nastukashii/p/4395814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!