1. randomization Input
In the use of the quick sorting algorithm, it is found that its performance is unstable. Its speed depends on the input, and the complexity is O (nlogn) in the best case ), the worst case is O (n ^ 2 ).
The simplest optimization method is to randomize the input and disrupt the input array order. This can minimize the possibility of poor input performance, which is very important for predicting the running time of the algorithm.
Considering that the STD standard library in C ++ already has the random_shuffle function, there are similar methods in other languages, but C # does not have this standard function, So I simply implement it myself.
Design:
Here we use the simplest O (n) Design and require n exchanges, which is undoubtedly very simple to implement.
Implementation:
public class RandomShuffle { private static Random rd; private static int N; public static IComparable[] shuffle(IComparable[] a) { rd = new Random(); N = a.Length; for (var i = 0; i < N; i++) { var newPosition = rd.Next(N); var temp = a[i]; a[i] = a[newPosition]; a[newPosition] = temp; } return a; }}
Summary:
Here, iterative writing is more concise and clear, but large-scale iteration will lead to the stackoverflowexception of the thread stack, so it is safer to use the loop.
2. Timer
The performance of an algorithm is measured in two aspects: running time and memory performance. In algorithm analysis, running duration is an important indicator, but it is difficult to accurately measure the running duration of a given program, fortunately, we only need a similar result.
We can use the system API to implement a timer with excellent precision, which can help us verify the algorithm speed.
Design:
Design a stopwatch class. Its elapsedtime () method can output the program execution time. It is implemented based on the. NET Framework datetime class and can return results in milliseconds/second count.
Implementation:
public class Stopwatch { private static DateTime startTime; public Stopwatch(DateTime time) { startTime = time; } public void elapsedTime() { DateTime endTime = DateTime.Now; double time = (endTime.Hour - startTime.Hour) * 3600 * 1000 + (endTime.Minute - startTime.Minute) * 60 * 1000 + (endTime.Second - startTime.Second) * 1000 + (endTime.Millisecond - startTime.Millisecond); if (time > 1000) { time /= 1000; Console.WriteLine("time: " + time + "s"); } else Console.WriteLine("time: " + time + "ms"); } }
Summary:
Although the timer is not accurate, it is enough to evaluate the performance of the algorithm.
Algorithm manual with 1 randomization input and Timer