[复习]快速排序

原始数组L1,从中任意选择一个基准数F(一般选择第1个),小于F的数据放在F的左边记为数组minList,大于F的数据放在F的右边记为数组maxList。那么

L1=minList+F+maxList

然后对minList和maxList再做这样的操作,直到minList和maxList中的元素个数为1或者0的时候停止

 

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("Hello World!");
 4             var lists = new List<int>() { 1, 2, 3, 4, 5, 5, 6, 1, 2, 3, 4, 5, 6, 3, 8, 9, 12, 0 };
 5 
 6             QuickSort(ref lists, 0, lists.Count);
 7             foreach (var item in lists)
 8             {
 9                 Console.Write(item + " ");
10             }
11             Console.ReadKey();
12         }
13 
14         static void QuickSort(ref List<int> nums, int left, int right)
15         {
16             if (left >= right)
17             {
18                 return;
19             }
20 
21             int i = left;
22             int j = right - 1;
23             int middle = nums[(left + right) / 2];
24             while (true)
25             {
26                 while (i < right && nums[i] < middle) { i++; };
27                 while (j > 0 && nums[j] > middle) { j--; };
28                 if (i == j) break;
29                 //两个值互换位置
30                 // 第一种可减少内存占用
31                 //时间换内存?
32                 /*
33                 nums[i] = nums[i] + nums[j];
34                 nums[j] = nums[i] - nums[j];
35                 nums[i] = nums[i] - nums[j];
36                 */
37                 //第二种追求速度
38                 //内存换时间?
39                 var temp = nums[i];
40                 nums[i] = nums[j];
41                 nums[j] = temp;
42                 if (nums[i] != nums[j])
43                 {
44                     continue;
45                 }
46                 j--;
47             }
48             QuickSort(ref nums, left, i);
49             QuickSort(ref nums, i + 1, right);
50         }

 

posted @ 2019-05-14 17:24  Red Cat  阅读(237)  评论(0编辑  收藏  举报

Copyright © 2022 LyShark Powered by .NET 6 on Kubernetes
Theme - LyTheme 1.0