Young氏矩陣實現代碼(C++) 演算法導論 6.3

來源:互聯網
上載者:User

標籤:

個人總結:

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 100000class 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.