zoukankan      html  css  js  c++  java
  • 图文演示 快速排序

    分治+指针交换法

    快排思想:
    1、给这组数据找一个基准位(一般是数组的第一位)pivot。
    2、以基准位把数组分为2个子串,左边的的数据都小于等于基准位,右边的数据都大于等于基准位。
    3、以同样的方式别对2个子串进行此方法排序,一直递归,直到数据排好顺序。
    递归的结束条件:需要递归的子串数组只有一个数据。

    给定原始数列如下,要求从小到大排序:
    在这里插入图片描述
    开局和挖坑法相似,我们首先选定基准元素Pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素:
    在这里插入图片描述
    接下来是第一次循环,从right指针开始,把指针所指向的元素和基准元素做比较。如果大于等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针。

    在当前数列中,1<4,所以right直接停止移动,换到left指针,进行下一步行动。

    轮到left指针行动,把指针所指向的元素和基准元素做比较。如果小于等于pivot,则指针向右移动;如果大于pivot,则left指针停止移动。

    由于left一开始指向的是基准元素,判断肯定相等,所以left右移一位。

    在这里插入图片描述

    由于7 > 4,left指针在元素7的位置停下。这时候,我们让left和right指向的元素进行交换。
    在这里插入图片描述

    接下来,我们进入第二次循环,重新切换到right向左移动。right先移动到8,8>2,继续左移。由于2<8,停止在2的位置。
    在这里插入图片描述
    切换到left,6>4,停止在6的位置。
    在这里插入图片描述
    元素6和2交换。
    在这里插入图片描述
    进入第三次循环,right移动到元素3停止,left移动到元素5停止。
    在这里插入图片描述
    元素5和3交换。
    在这里插入图片描述
    进入第四次循环,right移动到元素3停止,这时候请注意,left和right指针已经重合在了一起。
    在这里插入图片描述
    当left和right指针重合之时,我们让pivot元素和left与right重合点的元素进行交换。此时数列左边的元素都小于4,数列右边的元素都大于4,这一轮交换终告结束。
    在这里插入图片描述
    代码实现

    public class QuickSort000 {
        public static void quickSort(int[] arr,int low,int high){
            int i,j,pivot,t;
            if(low>high){ return;} //递归的终止条件,即需要排的子串个数为1
            i=low;
            j=high;
    
            pivot = arr[low]; //pivot就是基准位
            while (i<j) {
                while (pivot<=arr[j]&&i<j) {j--;}//先看右边,依次往左递减
                while (pivot>=arr[i]&&i<j) {i++;}//再看左边,依次往右递增
                if (i<j) { //如果满足条件则交换
                    t = arr[j];
                    arr[j] = arr[i];
                    arr[i] = t;
                }
            }
            System.out.println("i="+i+"j="+j);
            arr[low] = arr[j]; //取右边的j的下标,最后将基准为与i和j相等位置的数字交换
            arr[j] = pivot;
    
            quickSort(arr, low, i-1); //递归调用左半数组
            quickSort(arr, i+1, high);//递归调用右半数组
        }
    
    
        public static void main(String[] args){
            int[] arr = {6 ,1, 2, 7, 9 ,3 ,4, 5 , 8};
            quickSort(arr, 0, arr.length-1);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i]+" ");
            }
        }
    
    }
    

    超级好图
    在这里插入图片描述

  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/InternetJava/p/12543211.html
Copyright © 2011-2022 走看看