zoukankan      html  css  js  c++  java
  • 快速排序

    算法思想:

    算法在数组中选择一个称为主元(pivot)的元素,将数组分为两个子数组,使得第一个子数组的所有元素都小于或等于主元,二第二个子数组中的所有元素都大于主元。然后对第一子数组递归调用快速排序算法,然后对第二子数组递归调用快速排序算法。

    http://www.cnblogs.com/vanezkw/archive/2012/06/21/2557685.html

    package introjava;

    public class QuickSort2 {
    /**
    * description : 快速排序
    * @autor kwzhang
    * modify :2012-6-20
    *
    * @param pData
    * @param left
    * @param right
    * @return
    */
    public static void quickSort(int [] list)
    {
        quickSort(list, 0, list.length - 1);
    }
    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)  //元素比pivot大继续,小就停
                right--;
            if (left < right)
                n[left++] = n[right];          //将n[left]赋值为n[right],n[left]已经存在pivot里,然后left自增
            while (left < right && n[left] <= pivot)   //元素比pivot小继续,大就停
                left++;
            if (left < right)               //将n[right]赋值为n[left],这样完成n[left]和n[right]的交换,然后各自自增或自减,并返回当做下轮的pivot位置。
                n[right--] = n[left];
        }
        n[left] = pivot; //改成n[right] = pivot;结果也是对的,因为这是left和right是在同一个位置。
        return right;  //改成left也是对的
    }
    public static void main(String []args){
        int [] list = {1,2,3,4,5,6};
    // int [] list = {5, 2, 9, 3, 8, 4, 5, 5, 0, 1, 6, 7};
        for(int i = 0; i < list.length; i++)
            System.out.print(list[i] + " ");
        System.out.print(" ");

        quickSort(list);

        for(int i = 0; i < list.length; i++)
            System.out.print(list[i] + " ");
        }
    }

    PS: 觉得这个方法比较简单。

    另外一点需要注意:

    while (left < right && n[right] >= pivot) 
        right--;

    while (left < right && n[right--] >= pivot);

    是不一样的,--的优先级比[]要高,所以上面如果right值为10,则n[right]为n[10],而下面是n[9]!!!所以本想用下面这句代码,显得高端结果出错了。囧~~

  • 相关阅读:
    7zip 自解压安装程序
    修改当前启动菜单项的HyperVisorLaunchType
    VMware 虚拟镜像转 Hyper-V(Win10/2016)
    旋转基础知识
    变换及移动基础知识
    文字及排版章末小结
    文字排版相关
    文字变形及封套扭曲
    LinQ学习笔记.
    PHP笔记-PHP中Web Service.
  • 原文地址:https://www.cnblogs.com/hansonzhe/p/3595186.html
Copyright © 2011-2022 走看看