排序算法之三:快速排序

 算法分析:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。

一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。接着分别比较左右两边的序列,重复上述的循环。

复杂度:理想为O(nlogn),最差为O(n^2)

public void quicksort(int[] arr,int start,int end){
        if(start>=end){
            return;
        }
        //把数组中的第0个数作为基数
        int stard=arr[start];
        int low=start;
        int high=end;
        while(low<high){
            //右边的数比标准数大
            while(low<high&&stard<=arr[high]){
                high--;
                
            }
            //右边的数替换左边
            arr[low]=arr[high];
            while(low<high&&stard>=arr[low]){
                low++;
            }
            arr[high]=arr[low];
        }
        arr[low]=stard;
        //处理所有小的数
        quicksort(arr,start,low);
        //处理所有大的数
        quicksort(arr,low+1,end);
    }

猜你喜欢

转载自blog.csdn.net/qq_34015596/article/details/84923821