|
using System; using System.Collections.Generic; |
|
| using System.Linq; | |
| using System.Text; | |
| using System.Threading; | |
| using System.Diagnostics; | |
| namespace _.net_quicksort | |
| { | |
| class Program | |
| { | |
| static void Main(string[] args) | |
| { | |
| int wht_length; | |
| while (true) | |
| { | |
| Console.Write("请输入生成的随机数的个数(范围[60000~65000]) :"); | |
| string str = Console.ReadLine(); | |
| wht_length = int.Parse(str); | |
| if ((wht_length >= 60000) && (wht_length <= 65000)) | |
| break; | |
| Console.Write("输入错误,数字范围是 [60000~65000]"); | |
| } | |
| double [] wht_array = new double[wht_length];//定义获取随机数的输入数组 | |
| double [] wht_array1 = new double[wht_length]; | |
| Random r = new Random(396); | |
| for (int wht_i = 0; wht_i < wht_length; wht_i++) | |
| { | |
| double s = r.Next(-1000, 10000); | |
| wht_array1[wht_i]=wht_array[wht_i] = s; | |
| // Console.Write(wht_array[wht_i] + " "); | |
| } | |
| Stopwatch wht_timeCounter = new Stopwatch(); | |
| //============================================================================== | |
| quicksort wht_job1 = new quicksort(wht_array, 0, wht_length / 2 - 1); | |
| ThreadStart part1 = new ThreadStart(wht_job1.run); | |
| Thread newthread1 = new Thread(part1); | |
| quicksort wht_job2 = new quicksort(wht_array, wht_length / 2, wht_length - 1); | |
| ThreadStart part2 = new ThreadStart(wht_job2.run); | |
| Thread newthread2 = new Thread(part2); | |
| wht_timeCounter.Start(); | |
| newthread1.Start(); | |
| newthread2.Start(); | |
| newthread1.Join(); | |
| newthread2.Join(); | |
| quicksort thread3 = new quicksort(wht_array, 0, wht_length - 1); | |
| thread3.Merge(wht_array, 0, wht_length); | |
| wht_timeCounter.Stop(); | |
| TimeSpan timeRecord = wht_timeCounter.Elapsed; | |
| double wht_cost1 = timeRecord.TotalMilliseconds; | |
| Console.Write("并行时间:"); | |
| Console.WriteLine(wht_cost1); | |
| //======================================================================== | |
| wht_timeCounter.Start(); | |
| quicksort serial_qs = new quicksort(wht_array1, 0, wht_length - 1); | |
| serial_qs.compute(wht_array1, 0, wht_length - 1); | |
| wht_timeCounter.Stop(); | |
| TimeSpan timeRecord2 = wht_timeCounter.Elapsed; | |
| double wht_cost2 = timeRecord2.TotalMilliseconds; | |
| Console.Write("串行时间:"); | |
| Console.WriteLine(wht_cost2); | |
| Console.Write("加速比为:"); | |
| Console.WriteLine(wht_cost2 / wht_cost1); | |
| Console.Read(); | |
| } | |
| } | |
| class quicksort | |
| { | |
| private double [] wht_array; | |
| private int wht_start; | |
| private int wht_end; | |
| public quicksort(double [] wht_array, int wht_start, int wht_end) | |
| { | |
| this.wht_array = wht_array; | |
| this.wht_start = wht_start; | |
| this.wht_end = wht_end; | |
| } | |
| public void compute(double [] wht_array, int wht_start, int wht_end) | |
| { | |
| int wht_i = wht_start; | |
| int wht_j = wht_end; | |
| double wht_tmp; | |
| if (wht_start < wht_end) | |
| { | |
| wht_tmp = wht_array[wht_start]; | |
| while (wht_i != wht_j) | |
| { | |
| while ((wht_j > wht_i) && (wht_array[wht_j] >= wht_tmp)) | |
| wht_j--; | |
| wht_array[wht_i] = wht_array[wht_j]; | |
| while (wht_i < wht_j && wht_array[wht_i] <= wht_tmp) | |
| wht_i++; | |
| wht_array[wht_j] = wht_array[wht_i]; | |
| } | |
| wht_array[wht_i] = wht_tmp; | |
| compute(wht_array, wht_start, wht_i - 1); | |
| compute(wht_array, wht_i + 1, wht_end); | |
| } | |
| } | |
| public void Merge(double [] wht_array, int wht_begin, int wht_length) | |
| { | |
| double [] ss_R1 = new double [wht_length];//定义获取随机数的输入数组 | |
| int wht_i = wht_begin, wht_j = wht_length / 2, wht_k = 0; | |
| while ((wht_i < wht_length / 2) && (wht_j < wht_length)) | |
| if (wht_array[wht_i] <= wht_array[wht_j]) | |
| { | |
| ss_R1[wht_k] = wht_array[wht_i]; | |
| wht_i++; wht_k++; | |
| } | |
| else | |
| { | |
| ss_R1[wht_k] = wht_array[wht_j]; | |
| wht_j++; wht_k++; | |
| } | |
| while (wht_i < wht_length / 2) | |
| { | |
| ss_R1[wht_k] = wht_array[wht_i]; | |
| wht_i++; wht_k++; | |
| } | |
| while (wht_j < wht_length) | |
| { | |
| ss_R1[wht_k] = wht_array[wht_j]; | |
| wht_j++; wht_k++; | |
| } | |
| for (wht_k = 0, wht_i = wht_begin; wht_i < wht_length; wht_k++, wht_i++) | |
| { | |
| wht_array[wht_i] = ss_R1[wht_k]; | |
| } | |
| } | |
| public void run() | |
| { | |
| compute(wht_array, wht_start, wht_end); | |
| } | |
| } | |
| } |
原文:http://blog.csdn.net/christprince007/article/details/41750419