个人总结:
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] << " "; }
时间: 2024-10-05 22:17:22