算法基础——快速排序

快速排序的基本思想:

快速排序是对冒泡排序的一种改进,它的基本思想是:将一组数列分成独立的两部分,其中一部分的数据比另一部分的数据都要小,然后按照这个方法在这两部分中进行排序。
为了理解方便,我们直接上图吧。首先我们需要给一群高矮不同的人排队,如下图:
这里写图片描述

首先我们需要将这一群人划分为两部分,其中左半部分所有人的身高都比右半部分人的身高低,我们让一号位出列作为划分队伍的基准身高,然后让五号位出列互相比较,一号位比五号位高,所以五号位跑去左边站到一号位的位置。如图:
这里写图片描述

然后让已经出列的一号位与二号位比较,二号位比较矮,所以回到原来的位置,如图:
这里写图片描述

紧接着再与三号位比较,三号位比较矮,所以回到原来的位置,如图:
这里写图片描述

再与四号位比较,返现四号位比较高,所以四号位应该去右半部分的五号位位置,由于这时出列的一号位已经跟所有的比较完毕,所以他去往剩下的四号位,如图:
这里写图片描述

这是完成了第一次的划分,按照基准身高将整个队列划分成了两部分,左半部分所有的身高都比右半部分的低,如图:
这里写图片描述

下面我们开始第二次的划分,由于右半部分只有一个,所以不需要重新划分,只需要划分左半部分就可以,让左半部分的一号位为基准身高出列,与三号位比较,三号位比较高,所以三号位回到原来位置,一号位再与二号位比较,二号位比较高,所以二号位也回到原来位置,这是一号位已经与左半部分的所有人比较完毕,回到剩下的空闲位置(也就是一号位),如图:
这里写图片描述

我们可以看到已经将左半部分以基准划分成了左右两个区域(左区域不存在),同样的道理,我们将剩下的右半区域进行划分,以二号位为基准,与三号位比较,发现三号位比较矮,所以三号位去往左边的二号位,此时元素已经比较完毕,二号位去往空闲的三号位。如图:
这里写图片描述

这是我们就形成了一个有序的序列,下面我们将这个流程用代码来表示:

public class QuickTest {
    public static void main(String[] args) {
        int[] data = new int[]{10, 5, 154, 25, 41, 56, 3, 57, 4, 57};
        quickSort(data, 0, data.length - 1);
        for (int i : data) {
            System.out.println(i);
        }
    }

    public static void quickSort(int[] data, int start, int end) {
        if (start < end) {
        //获取到基准数据的索引,然后进行递归排序
            int mid = divide(data, start, end);
            quickSort(data, start, mid - 1);
            quickSort(data, mid + 1, end);
        }
    }

    public static int divide(int[] data, int start, int end) {
        //以第一个元素为基准
        int temp = data[start];
        while (start < end) {
        //基准元素与队尾开始比较,若队尾元素较大,则比较前一个元素
            while (start < end && temp <= data[end]) {
                end--;
            }
            data[start] = data[end];
        //基准元素与队头开始比较,若队头元素较小,则比较后一个元素    
            while (start < end && temp >= data[start]) {
                start++;
            }
            data[end] = data[start];
        }
        data[start] = temp;
        return start;
    }
}

猜你喜欢

转载自blog.csdn.net/ww55555577/article/details/55194231