阿里巴巴网站建设,牛什么网站建设,网站 没有备案 访问不了,阜沙网站建设快速排序(Quick Sort)使用分治法算法思想。快速排序介绍它的基本思想是: 选择一个基准数#xff0c;通过一趟排序将要排序的数据分割成独立的两部分#xff1b;其中一部分的所有数据都比另外一部分的所有数据都要小。然后#xff0c;再按此方法对这两部分数据分别进行快速排…快速排序(Quick Sort)使用分治法算法思想。快速排序介绍它的基本思想是: 选择一个基准数通过一趟排序将要排序的数据分割成独立的两部分其中一部分的所有数据都比另外一部分的所有数据都要小。然后再按此方法对这两部分数据分别进行快速排序整个排序过程可以递归进行以此达到整个数据变成有序序列。快速排序实现从数列中挑出一个基准值。将所有比基准值小的摆放在基准前面所有比基准值大的摆在基准的后面(相同的数可以到任一边)在这个分区退出之后该基准就处于数列的中间位置。递归地把基准值前面的子数列和基准值后面的子数列进行排序。下面以数列a{30,40,60,10,20,50}为例演示它的快速排序过程(如下图)。上图只是给出了第1趟快速排序的流程。在第1趟中设置xa[i]即x30。从右 -- 左查找小于x的数: 找到满足条件的数a[j]20此时j4然后将a[j]赋值a[i]此时i0接着从左往右遍历。从左 -- 右查找大于x的数: 找到满足条件的数a[i]40此时i1然后将a[i]赋值a[j]此时j4接着从右往左遍历。从右 -- 左查找小于x的数: 找到满足条件的数a[j]10此时j3然后将a[j]赋值a[i]此时i1接着从左往右遍历。从左 -- 右查找大于x的数: 找到满足条件的数a[i]60此时i2然后将a[i]赋值a[j]此时j3接着从右往左遍历。从右 -- 左查找小于x的数: 没有找到满足条件的数。当ij时停止查找然后将x赋值给a[i]。此趟遍历结束按照同样的方法对子数列进行递归遍历。最后得到有序数组快速排序时间复杂度和稳定性快速排序稳定性快速排序是不稳定的算法它不满足稳定算法的定义。算法稳定性 -- 假设在数列中存在a[i]a[j]若在排序之前a[i]在a[j]前面并且排序之后a[i]仍然在a[j]前面。则这个排序算法是稳定的快速排序时间复杂度快速排序的时间复杂度在最坏情况下是O(N2)平均的时间复杂度是O(N*lgN)。这句话很好理解: 假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N)需要遍历多少次呢? 至少lg(N1)次最多N次。为什么最少是lg(N1)次? 快速排序是采用的分治法进行遍历的我们将它看作一棵二叉树它需要遍历的次数就是二叉树的深度而根据完全二叉树的定义它的深度至少是lg(N1)。因此快速排序的遍历次数最少是lg(N1)次。为什么最多是N次? 这个应该非常简单还是将快速排序看作一棵二叉树它的深度最大是N。因此快读排序的遍历次数最多是N次。代码实现/*** 快速排序: Java** author skywang* date 2014/03/11*/public class QuickSort {/** 快速排序** 参数说明: * a -- 待排序的数组* l -- 数组的左边界(例如从起始位置开始排序则l0)* r -- 数组的右边界(例如排序截至到数组末尾则ra.length-1)*/public static void quickSort(int[] a, int l, int r) {if (l r) {int i,j,x;i l;j r;x a[i];while (i j) {while(i j a[j] x)j--; // 从右向左找第一个小于x的数if(i j)a[i] a[j];while(i j a[i] x)i; // 从左向右找第一个大于x的数if(i j)a[j--] a[i];}a[i] x;quickSort(a, l, i-1); /* 递归调用 */quickSort(a, i1, r); /* 递归调用 */}}public static void main(String[] args) {int i;int a[] {30,40,60,10,20,50};System.out.printf(before sort:);for (i0; ia.length; i)System.out.printf(%d , a[i]);System.out.printf(\n);quickSort(a, 0, a.length-1);System.out.printf(after sort:);for (i0; ia.length; i)System.out.printf(%d , a[i]);System.out.printf(\n);}
}