Just count the number of steps of the program with the input size n. Lets understand by the example
for (i=0; i< n; i++)
for (j=0; i<n; j++)
if (a[i] > a[j])
temp = a[I];
a[i] = a[j];
a[j] = temp;
Because of the for statement at line 3, the block between lines 4 and 12 gets run exactly N times, where N is the length of the list. This block is itself a for loop that runs exactly n times, so the if block between lines 6 and 10 gets executed N^2 times in all.
Line 1-2: Executed once
Line 3: Executed once (sets i = 1 at the beginning)
Line 4: Executed n times (sets J = 1 once per value of I)
Line 5: Executed n^2 times
Line 6: Executed n^2 times
Line 7: Executed between 0 and n^2 times.
Line 8: Executed between 0 and n^2 times.
Line 9: Executed between 0 and n^2 times.
Line 10: Executed n^2 times (increments j and jumps to line 5)
Line 11: Executed n times (increments i and jumps to line 4)
So if we count the number of times a line gets executed, we have something between 6N^2+2N+3 (worst case), and 2N^2+2N+3 (best case). Which tells us that as the N increases then the time of the execution is proportional to N^2 which means time complexity of the program is O(n^2).
The space complexity of an algorithm is measured as the maximum amount of space used at any one time. In this case we need array a which is of the order n and one temp variable for the swap. So the space complexity of the above program is n+1 or ~n.