(四)算法--排序算法分治 快速排序

快速排序

        思想:快速排序算法是通过一趟将要排序的数据分割成独立的两部分,通常以首位的数字作为分割点,让分割点左边的数据都小于分割点右边的数据,这样就确定了分割点所在的位置。然后按照此种方法,对这两部分数据分别进行快速排序,直到整个数据变成有序序列。

(四)算法--排序算法分治 快速排序_第1张图片

(四)算法--排序算法分治 快速排序_第2张图片

平均时间复杂度:(nlogn)

       从图中了解到,我们是选择每列数字的首位分割点,这样每次让在分割点左边的数都小于分割点,在右边的都大于分割点。

       但是怎么做到每列让首位数字在正确的位置上呢?

       方式一(常见):http://developer.51cto.com/art/201403/430986.htm这篇文章写的比较通俗易懂,是通过左 右指针的移动,大小的数字交换和首位数字的交换,下图为确定首位数为分割点所在位置的过程(图片来自己链接文章中)。



(四)算法--排序算法分治 快速排序_第3张图片

(四)算法--排序算法分治 快速排序_第4张图片

(四)算法--排序算法分治 快速排序_第5张图片

(四)算法--排序算法分治 快速排序_第6张图片

(四)算法--排序算法分治 快速排序_第7张图片

(四)算法--排序算法分治 快速排序_第8张图片

(四)算法--排序算法分治 快速排序_第9张图片

       java代码如下

public void quickSort_1(int[] num, int start, int end) {
        int left, right, current, temp;
        if (start < end) {
            current = num[start];
            left = start;
            right = end + 1;
            while (true) {
                while (true) {
                    if (left >= end || num[++left] > current) {
                        break;
                    }
                }
                while (true) {
                    if (right <= start || num[--right] < current) {
                        break;
                    }
                }
                if (left >= right) {
                    break;
                }
                temp = num[left];
                num[left] = num[right];
                num[right] = temp;
            }
            num[start] = num[right];
            num[right] = current;
            System.out.println(Arrays.toString(num));
            quickSort_1(num, start, left - 1);
            quickSort_1(num, right + 1, end);
        }
    }


       方式二: 算法视频比较生动,每一行的第一个人都在找自己的正确位置,通次通过首数字的交换达到左侧的都小于自己,右侧的都大于自己。也可以实现快速排序。



总结:

        算法的代码要一点点调试修改运行,调试修改运行....



你可能感兴趣的:(【算法设计与分析】)