1. Algrithom
?Given an array of values, pick a value as a pivot value
?Check each value against the pivot value and
- bring each value higher than the pivot value to the right of the pivot value: GreaterList
- bring each value lower than or equal to the pivot to the left of the pivot value: LessList
? Recursively call the algorithm for the array left and the array right of the pivot (which is now in the right spot).
? Combine LessList + pivot + GreaterList.
2. Implement
public static void TestSimpleQuickSort() { List<int> intArray = TestData.GetListFromString(); List<int> result = new List<int>(); TimeWatcher.StartWatchFunc(SimpleQuickSort, intArray, out result); //TimeWatcher.StartWatchDelegate(SimpleQuickSort, intArray, out result); } public static List<int> SimpleQuickSort(List<int> a) { Random r = new Random(); List<int> less = new List<int>(); List<int> greater = new List<int>(); if (a.Count <= 1) return a; //int pos = r.Next(a.Count); int pos = a.Count/2; int pivot = a[pos]; a.RemoveAt(pos); foreach (int x in a) { if (x <= pivot) { less.Add(x); } else { greater.Add(x); } } return Concat(SimpleQuickSort(less), pivot, SimpleQuickSort(greater)); } private static List<int> Concat(List<int> less, int pivot, List<int> greater) { List<int> sorted = new List<int>(less); sorted.Add(pivot); foreach (int i in greater) { sorted.Add(i); } return sorted; }
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test.CA.Algorithm.Sorting { public class TimeWatcher { public delegate List<int> TestDelegate(List<int> array); public static void StartWatchAction( Action<List<int>> func, List<int> array) { Stopwatch watch = new Stopwatch(); watch.Start(); func(array); watch.Stop(); Console.WriteLine(watch.Elapsed); } public static void StartWatchDelegate(TestDelegate func, List<int> array, out List<int> result) { Stopwatch watch = new Stopwatch(); watch.Start(); result = func(array); watch.Stop(); Console.WriteLine(watch.Elapsed); } public static void StartWatchFunc(Func<List<int>, List<int>> func, List<int> array, out List<int> result) { Stopwatch watch = new Stopwatch(); watch.Start(); result = func(array); watch.Stop(); Console.WriteLine(watch.Elapsed); } } }
算法: 排序: 快速排序
时间: 2024-11-09 13:55:14