標籤:
個人總結:
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