3分钟搞定 面试必备八大排序算法 之 快速排序 - Go语言中文社区

3分钟搞定 面试必备八大排序算法 之 快速排序


排序算法 - 快速排序

1.快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高.
2.因此经常被采用,再加上快速排序思想----分治法也确实实用.

1.算法原理

快速排序,说白了就是给基准数据找其正确索引位置的过程.
   如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.
  
在这里插入图片描述
首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置 ,结果如下:
在这里插入图片描述
然后开始从前往后扫描,如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值(如上图46=>tmp),就再将low位置的值赋值给high位置的值,指针移动并且数据交换后的结果如下:
在这里插入图片描述
然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将high位置的值赋值给low位置的值,结果如下:
在这里插入图片描述
然后再开始从前往后遍历,直到low=high结束循环,此时low或high的下标就是基准数据23在该数组中的正确索引位置.如下图所示.
在这里插入图片描述
这样一遍走下来,可以很清楚的知道,其实快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.
  以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。

3.JAVA实现

public static void quickSort(int[] arr,int low,int high){
        if(low<high){
            int index = getIndex(arr,low,high);
            // 进行递归对index之前和之后的数组进行相同的操作使整个数组变成有序
            quickSort(arr,low,index-1);
            quickSort(arr,index+1,high);
        }
    }
    public static int getIndex(int[] arr,int low,int high){
        //用temp存储基准数
        int temp = arr[low];
        while (low<high){
            // 当队尾的元素大于等于基准数据时,向前挪动high指针
            while(low<high && arr[high]>=temp){
                high--;
            }
            // 如果队尾元素小于tmp了,需要将其赋值给low
            if(low<high){
                arr[low] = arr[high];
                low++;
            }
            // 当队首元素小于等于tmp时,向前挪动low指针
            while(low<high && arr[low]<=temp){
                low++;
            }
            // 当队首元素大于tmp时,需要将其赋值给high
            if(low<high){
                arr[high] = arr[low];
                high--;
            }
        }
        // 跳出循环时low和high相等,此时的low或high就是temp的正确索引位置
        // 由原理部分可以很清楚的知道low位置的值并不是temp,所以需要将temp赋值给arr[low]
        arr[low] = temp;
        return low;
    }

4.复杂度

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_36868951/article/details/104998880
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢