快速排序法

快速排序(Quicksort)是对冒泡排序的一种改进。在排序效率为O(N*logN)的几种排序算法中效率最高的。

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小都要小,然后再按此方法对两部分数据分别进行快速排序,直到各分区只有一个数位置,整个排序过程可以递归进行,以此达到整个数据变成有序序列。所有快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回进准的最终位置以便分治递归。
 
举例说明:假设要排序序列为(6  3  1  4  7  5
首先将左起第一个 6  作为基准值,也就是在[0]位置挖个洞,使用i和j对两边进行扫描,把比6小的和比6大的元素分开,j从右向左扫描,找一个比6小的值来填这个洞,首先比较56比较,56小,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);
            }
        }  

 

posted @ 2019-05-02 19:24  NCat  阅读(191)  评论(0)    收藏  举报