码迷,mamicode.com
首页 > 编程语言 > 详细

Java 快速排序算法的简单说明及实现

时间:2020-01-28 22:46:55      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:性能   print   ret   inf   quic   分治   第一个   代码   过程   

快速排序是对冒泡排序的一种改进。其基本思想是基于分治法的:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中所有元素小于pivot,L[k+1...n]中所有元素大于或等于pivot,则pivot放在最终位置L(k)上,这个过程称一趟快速排序。而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终的位置上。

首先假设划分算法已知,记为partition(),返回的是上述中的k,注意到L(k)已经在最终的位置,所以可以先对表进行划分,而后对两个表调用相同的排序操作。因此可以递归地的调用快速排序算法进行排序,具体的程序结构如下:

1 public static void quickSort(int[] array, int low, int high) {
2         if (low < high) {//递归跳出的条件
3             int pivotpos = partition(array, low, high);
4             //partition()即是划分操作,将表划分为两个子表
5             quickSort(array, low, pivotpos - 1);
6             quickSort(array, pivotpos + 1, high);//依次对两个子表进行递归
7         }
8     }

从上面的代码也不难看出快速排序算法的关键在于划分操作,同时快速排序算法的性能也主要取决于划分操作的好坏。本人参考严蔚敏老师所著教材上的划分操作思想,假设每次总是以当前表中第一个元素作为枢纽(基准)对表进行划分,则必须将表中比枢纽值大的元素向右移动,比枢纽值小的元素向左移动,使得一趟partition()操作之后,表中的元素被枢纽值一分为二。

//严版教材中的划分算法(一趟排序过程)
    public static int partition(int[] array, int low, int high) {
        int pivot = array[low];//将表中第一个元素设为枢纽值,对表进行划分
        while (low < high) {//循环跳出条件
            while (low < high && array[high] >= pivot) {
                high--;//将比枢纽值小的元素移动到右端
            }
            array[low] = array[high];
            while (low < high && array[low] <= pivot) {
                low++;//将比枢纽值大的元素移动到左端
            }
            array[high] = array[low];
        }
        array[low] = pivot;//将枢纽元素放回最终位置
        return low;//返回存放枢纽的最终位置
    }

运行下试试:

int[] arr = new int[]{43, 25, 71, -42, 45, -69, 11, 31, 29, -4, 0, -17, 21};

将该数组进行快排

/*
    数组的快速排序
*/
public class quickSort {
    public static void main(String[] args) {
        int[] arr = new int[]{43, 25, 71, -42, 45, -69, 11, 31, 29, -4, 0, -17, 21};
        System.out.println("排序前:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
        quickSort(arr, 0, arr.length - 1);
        System.out.println();
        System.out.println("排序后:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
    }

    public static void quickSort(int[] array, int low, int high) {
        if (low < high) {
            int pivotpos = partition(array, low, high);
            quickSort(array, low, pivotpos - 1);
            quickSort(array, pivotpos + 1, high);
        }
    }

    //严版教材中的划分算法(一趟排序过程)
    public static int partition(int[] array, int low, int high) {
        int pivot = array[low];//将表中第一个元素设为枢纽值,对表进行划分
        while (low < high) {//循环跳出条件
            while (low < high && array[high] >= pivot) {
                high--;//将比枢纽值小的元素移动到右端
            }
            array[low] = array[high];
            while (low < high && array[low] <= pivot) {
                low++;//将比枢纽值大的元素移动到左端
            }
            array[high] = array[low];
        }
        array[low] = pivot;//将枢纽元素放回最终位置
        return low;//返回存放枢纽的最终位置
    }
}

技术图片

结果是正确的

Java 快速排序算法的简单说明及实现

标签:性能   print   ret   inf   quic   分治   第一个   代码   过程   

原文地址:https://www.cnblogs.com/xianghaoran/p/12238983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!