快速排序法
快速排序(Quicksort)是对冒泡排序的一种改进。在排序效率为O(N*logN)的几种排序算法中效率最高的。
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小都要小,然后再按此方法对两部分数据分别进行快速排序,直到各分区只有一个数位置,整个排序过程可以递归进行,以此达到整个数据变成有序序列。所有快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回进准的最终位置以便分治递归。
举例说明:假设要排序序列为(6 3 1 4 7 5)
首先将左起第一个 6 作为基准值,也就是在[0]位置挖个洞,使用i和j对两边进行扫描,把比6小的和比6大的元素分开,j从右向左扫描,找一个比6小的值来填这个洞,首先比较5和6比较,5比6小,5来填洞,填完后,发现又多了一个洞[5],再用i从左向右扫描,找一个比6大的数填洞,找到了7 让7填在洞[5]上,此时的序列为(7 61 4 3 5),此事 i=1,j=5 由于i<>j 故以此类推,直到i=j;此为一趟排序,将排序数组分为两部分,再采用递归的方法将左右两边的数进行同样排序。
C#代码实现:
static void QuickSort(ref List<int> nums, int left, int right) { if (left < right) { int i = left; int j = right; int key = nums[left]; while (true) { while (j > 0 && nums[j] > key) { j--; }; while (i < right && nums[i] < key) { i++; }; if (i == j) break; nums[i] = nums[i] + nums[j]; nums[j] = nums[i] - nums[j]; nums[i] = nums[i] - nums[j]; if (nums[i] == nums[j]) j--; } QuickSort(ref nums, left, i-1); QuickSort(ref nums, j+ 1, right); } }
真正的大师永远怀着一颗学徒的心。

浙公网安备 33010602011771号