The new keyword allows you to create variables/objects dynamically during runtime. The delete keyword frees-up the memory that was allocated by new.
I'm not sure if this is what is meant by dynamic initialization. Usually, "initialize" means to give an initial (starting value) , or default value.
As for pointers and arrays, the assignment might be an exercise using pointer arithmetic. Hint: if you incriment a pointer to an element in an array, the pointer will now point-to the next element in the array.
int x; // Declare x, don't initialize
int y = 0; // Delcare and initialize y
x = 5; // Initialize x=5
The other possibility is an array of pointers. For example, you would make the first pointer (in the pointer arrray) point-to the smallest value in the data array (not to the first element in the array). When you are done with the sort, and you sequence through the pointer array, printing the pointed-to data, the results will print in the sorted order, even though the original data array is still unsorted. Sorry, I'm not explaining that very well...
I hope this helps you get started.