7 Java 快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。

1、基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以 递归进行,以此达到整个数据变成有序序列。

2、算法描述

快速排序使用分治策略来把一个序列( list )分为两个子序列(sub-lists)。步骤为:

①.从数列中挑出一个元素,称为基准(pivot)。

②.重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

③. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归到最底部时,数列的大小是0或1,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

3、代码实现

public class QuicklySort {

    public static void main(String[] args) {
        Long startTime = System.currentTimeMillis();
        //int[] array = new int[]{10, 1, 9, 2, 8, 3, 7, 4, 6, 5};
        int[] array = new int[100000];
        for (int i = 0; i < 100000; i++) {
            array[i] = (int) (Math.random() * 100000);
        }
        quicklySort(array, 0, array.length - 1);
        Long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }

    public static void quicklySort(int[] array, int low, int high) {
        if (null == array || array.length <= 0) {
            return;
        }
        if (low >= high )
        {
            return;
        }

        int left = low;
        int right = high;
        int key = array[left];
        while (left < right) {
            // right左移直到获取到比key小的元素
            while (left < right && array[right] >= key) {
                right--;
            }
            while (left < right && array[left] <= key) {
                left++;
            }
            if (left < right) {
                swap(array, left, right);
            }
        }
        swap(array, low, left);
        //System.out.println(Arrays.toString(array));
        quicklySort(array, low, left - 1);
        quicklySort(array, left + 1, high);
    }

    private static void swap(int array[], int low, int high) {
        int tmp = array[low];
        array[low] = array[high];
        array[high] = tmp;
    }

}
View Code

猜你喜欢

转载自www.cnblogs.com/Latiny/p/11076493.html