快速排序

来源:互联网 发布:社会网络分析大数据 编辑:程序博客网 时间:2024/06/07 00:45

算法思想:快排和归并排序一样采用了分治思想,包括三部分治过程:

 分解——将数组A[p...r]划分成两个子数组,其中A[p...q-1]<=A[q]<=A[q+1...r],A[q]称为划分主元,可以是数组中的任意元素,最简单的取法为数组最后一个元素,即A[r]

                 解决——通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序

 合并——因为子数组都是原址排序,因此不需要合并,A[p...r]已经有序


算法伪代码如下:




java实现:

public class TestQuickSort {public static void main(String[] args) {int[] A = new int[10];System.out.print("快排之前:");for(int i = 0;i < A.length;i++) {A[i] = (int)(Math.random() * 10);System.out.print(A[i] + " ");}System.out.println("");quickSort(A,0,A.length-1);System.out.print("快排之后:");for(int i = 0;i < A.length;i++) {System.out.print(A[i] + " ");}}//快排public static void quickSort(int[] A,int p,int r) {if(p < r) {int q = partition(A, p, r);quickSort(A,p,q-1);quickSort(A, q+1, r);}}//划分操作public static int partition(int[] A,int p,int r) {//i指针指向当前左侧已经划分好的最后一个元素int i = p-1;int x = A[r];//j指针指向当前待划分的元素for(int j = p;j < r;j++) {if(A[j] < x) {int temp = A[j];A[j] = A[i+1];A[i+1] = temp;i++;}}//将划分主元归位A[r] = A[i+1];A[i+1] = x;return i+1;}}

运行结果:



复杂度分析:

快速排序的时间复杂度和划分主元的选取密切相关,当划分完全不平衡时,即出现最坏情况,划分的子问题规模为n-1和0,则时间复杂度为O(n2)

当划分比例是常数时,时间复杂度为O(nlogn)


稳定性:

快速排序算法是不稳定的


原创粉丝点击