快速排序思想|实现|优化

243 阅读2分钟
/*通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。*/
 public void quickSort(int[] nums,int low,int high) {
        int i = low;
        int j = high;
        int temp;
        while (i < j) {
            temp = nums[low];
            while (i < j) {
                while(i<j && temp < nums[j]) j--;
                if (i < j) {
                    nums[i] = nums[j];
                    i++;
                }

                while(i<j && temp > nums[i]) i++;
                if (i < j) {
                    nums[j] = nums[i];
                    j--;
                }
            }
            nums[i] = temp;
            quickSort(nums,low,i-1);
            quickSort(nums,i+1,high);
        }
    }
    
    public void main(){
        int[] arr = {6,11,7,4,5};
        int low = 0;
        int high = 4;
        quickSort(arr,0,4);
        for (int i : arr) {
            System.out.println(i);
        }
    }


image.png

快速排序的优化 基本的快速排序取序列的第一个或者最后一个都不是最好的方法,如果数组是有序的,此时的分割就是比较糟糕的分割,因为每次划分只能使待排序列减一,此时位最坏的情况,时间复杂度是O(n ^2) 此时采用三数中值分割法:一组序列的中值是枢纽元最好的选择(因为可以将序列均分为两个子序列,这是的时间复杂度是O(NlogN)),但是要计算一组数组中的中位数就比较耗时,所以通过选取最左、最右和中间元素的中值来替代。 对于小数组(N<=20),快速排序不如插入排序,所以将小的序列使用插入排序替代,较好的截止范围是10,快速排序使用了分治的思想.所以在n很大时,分治处理的效率很高.但是n很小时,分治的优势就体现不出来了.相反其他插入货或是选择排序会更快.因为cpu在内存中执行之时.不需要频繁的隔着很远的内存单元读取数据放置入寄存器.只需要顺序读取.所以其他算法在n很小时比快速排序快.这一点类似硬盘的读写.