快速排序算法总结并举例说明

来源:互联网 发布:win7怎样关闭网络共享 编辑:程序博客网 时间:2024/06/06 02:51

快速排序思想:

 

快速排序算法是对冒泡排序的一种改进,它采用了一种分治的策略,通常称其为分治法。分治法的思想是:将原问题分解为若干个规模更小的但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

即通过一趟排序将进行排序的数据分割成独立的两部分,其中一部分的数据比另一部分的数据都大,然后再按此访求对这两部分数据分别进行快速排序,这样循环往复,直到进行排序的数据按一定的顺序排列。

 

快速排序过程图示如下:

 

 

 

 

快速排序的步骤:

 

1.分解:

在数组arr[low...high]中任意选取一个元素作为参考值(通常选取第一个作为参考值)与其他元素进行大小比较,以此为基准将当前无序的数组分为左右两个较小的子区间,左边的元素都小于或者等于它,右边的元素都大于它。然后求取这个参考值在这次排序之后在这个数组中的位置的值。

 

2.求解:

通过上面获得的参考值的位置把原数组分解成两个不同的数组(即把上面获取的左右两个不同的区间放入两个不同的数组),然后再递归调用快速排序分别对这两个数组进行排序。

 

3.组合:

由于是在同一个数组中分解成不同的区间,而不是真的把原数组分解成多个数组,多个区间调用快速排序还是在原数组中进行,因此组合这一步是一个空操作。

 

 

快速排序算法的核心方法(为了便于说明,数组以整型数组为例):

 

1.快速排序的方法

public void quickSort(int arr[], int low, int high) {
        int point;  //每次排序之后返回的分界点
        if (low < high) {  //直到low==high为止
            point = point(arr, low, high);  //上次快速排序获取到的键值的位置,依此把原数组分为左右两个区间
            quickSort(arr, low, point - 1);  //左区间
            quickSort(arr, point + 1, high);  //右区间
        }
    }

2.获取分界点的方法

public int point(int arr[], int i, int j) {
        int key = arr[i];   //指定一个键值来作为每次排序的比较值,每次排序之后让大于它的数放在后面,让小于它的数放在前面
        while (i < j) {      //如果i<j则一直进行下面的操作
            while (i < j && key <= arr[j]) {   //如果i<j并且键值小于等于arr[j]时一直进行下面的操作
                j--;
            }

            if (i < j) {   //如果进行上面的操作之后,键值大于arr[j],但是仍然是i<j,则进行下面的操作
                arr[i++] = arr[j];
            }

            while (i < j && key >= arr[i]) {   //如果i<j并且键值大于等于arr[i],则进行下面的操作
                i++;
            }

            if (i < j) {  //如果进行上面的操作之后,键值小于arr[i],但是仍然是i<j,则进行下面的操作
                arr[j--] = arr[i];
            }
        }
        arr[i] = key;
        return i;
    }

 

 

 

 

举例说明如下:

 

public class QuickSort {

    public static void main(String args[]) {
        int[] a = {5, 4, 8, 2, 7};
        QuickSort qs = new QuickSort();
        qs.quickSort(a, 0, a.length - 1);

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

    public void quickSort(int arr[], int low, int high) {
        int point;    //每次排序之后返回的分界点
        if (low < high) {
            point = point(arr, low, high);
            quickSort(arr, low, point - 1);
            quickSort(arr, point + 1, high);
        }
    }

    public int point(int arr[], int i, int j) {
        int key = arr[i];  //指定一个键值来作为每次排序的比较值,每次排序之后让大于它的数放在后面,让小于它的数放在前面
        while (i < j) {  //如果i<j则一直进行下面的操作
            while (i < j && key <= arr[j]) {   //如果i<j并且键值小于等于arr[j]时一直进行下面的操作
                j--;
            }

            if (i < j) {   //如果进行上面的操作之后,键值大于arr[j],但是仍然是i<j,则进行下面的操作
                arr[i++] = arr[j];
            }

            while (i < j && key >= arr[i]) {   //如果i<j并且键值大于等于arr[i],则进行下面的操作
                i++;
            }

            if (i < j) {   //如果进行上面的操作之后,键值小于arr[i],但是仍然是i<j,则进行下面的操作
                arr[j--] = arr[i];
            }
        }
        arr[i] = key;
        return i;
    }
}

 

 

快速排序演示


 

 

原创粉丝点击