算法一:快速排序算法

一、算法概念。java

    快速排序是由东尼·霍尔所发展的一种排序算法。在平均情况下,排序 n 个项目要Ο(n log n)次比较。在最坏情况下则须要Ο(n2)次比较,但这种情况并不常见。事实上,快速排序一般明显比其余Ο(n log n) 算法更快,由于它的内部循环(inner loop)能够在大部分的架构上颇有效率地被实现出来。web

二、算法思想。算法

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

三、实现思路。oop

①以第一个关键字 K 1 为控制字,咱们能够称为 "基准"(pivot),将 [K 1 ,K 2 ,…,K n ] 分红两个子区,使左区全部关键字小于等于 K 1 ,右区全部关键字大于等于 K 1 ,最后控制字居两个子区中间的适当位置,这个称为分区(partition)操做。在子区内数据尚处于无序状态。 
②把左区做为一个总体,用①的步骤进行处理,右区进行相同的处理。(即递归)
ui

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,可是这个算法总会退出,由于在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
spa

③重复第①、②步,直到左区处理完毕。code

四、实现代码。orm


public class QuickSort {

    /**
     * @param n quick sort data
     * @param left 
     * @param right
     */
    static void quicksort(int n[], int left, int right) {
        int dp;
        if (left < right) {
            dp = partition(n, left, right);
            quicksort(n, left, dp - 1);
            quicksort(n, dp + 1, right);
        }
    }

    static int partition(int n[], int left, int right) {
        int pivot = n[left];
        while (left < right) {
            while (left < right && n[right] >= pivot)
                right--;
            if (left < right)
                n[left++] = n[right];
            while (left < right && n[left] <= pivot)
                left++;
            if (left < right)
                n[right--] = n[left];
        }
        n[left] = pivot;
        return left;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        int n[] = {2, 1, 4, 3, 8, 7, 10, 9, 12};
        quicksort(n, 0, n.length-1);
        for(int i=0; i<n.length; i++){
            System.out.println(n[i]);
        }
    }

}
相关文章
相关标签/搜索