【排序】5.快速排序
快速排序:是对冒泡排序的一种改进
通过一趟排序将要排序的数据分割为独立的两部分,其中一部分所有数据都比另一部分小,然后递归
public static int[] quicksort(int []a,int left,int right){//快速排序 int l=left; int r=right; int flag =0; if(l<=r){ flag=a[l]; //标记 while(l!=r){ while(l<r&&a[r]>=flag){ r--; } a[l]=a[r];//从右往左发现比flag小的,与左边交换 while(l<r&&a[l]<=flag){ l++; } a[r]=a[l];//从左往右发现比flag大的,与右边交换 } a[l]=flag; quicksort(a, left, l-1); //递归 quicksort(a, r+1, right); } return a; }
快速排序是一种不稳定的排序算法
时间复杂度:当分区选择的元素总为待排元素的最大或最小值时,时间复杂度达到最大,为O(n²)
分区选取的基准元素为待排序元素中的中值,为最好情况,时间复杂度为O(nlog2n)
空间复杂度:快速排序的空间复杂度为O(nlog2n)
优化:三平均分区法:不选择待排数组的第一个数作为中轴,而是选择待排数组的最左、最右、中间的三个元素的
中间值作为中轴
优点:使得最坏情况的发生几率减小了
未改进的快速排序算法为了防止比较时数组越界,最后要设置哨点
根据分区大小调整算法:快速排序对小规模的数据集性能不是很好,当分区规模足够小,就可以停止快速排序,改用其他算法
在递归排序子分区时,优先排序最小的分区,更加有效的利用存储空间,加速算法的执行
不同的分区方案考虑:将分区由两块改为三块,一块小于、一块大于、一块等于
防止相等元素过多
并行的快速排序:由于快速排序算法是采用分治技术来进行实现的,很容易能够在多台处理机上并行处理
缺陷:创建一个线程所需要的时间要远远大于两个元素比较和交换的时间
分区的这一步骤总是要在子序列并行处理之前完成,限制了并行程度
改进后的并行快速排序算法使用2n个指针来并行处理分区这一步骤,从而增加算法的并行程度