[复习]快速排序
原始数组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 }