您的位置:首页 > 编程语言 > Java开发

JAVA排序算法大整理——快速排序

2018-03-14 17:19 239 查看
各种排序算法的比较:来源《数据结构与STL》 北京邮电大学出版社 肖波 徐雅静



1.快速排序
2.归并排序

java中归并排序比快速排序快吗?https://www.zhihu.com/question/24727766

3.选择排序
----------------快速排序
(1)快速排序是一种不稳定的排序。
    最佳时间复杂度O(nlogn):最好情况是当每次划分时左侧序列和右侧序列的长度相等时
    最坏时间复杂度O(n^2):最坏情况是当待排序元素为逆序或正序时。
    平均来说:快速排序算法的时间复杂度为O(nlogn),栈的深度为O(logn),这里的log是以2为底。
    辅助空间:O(nlogn)~O(n)
转载自https://www.cnblogs.com/coderising/p/5708801.html
算法思想:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(lo指向起始位置,hi指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换lo和hi位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换lo和hi位置的值,如此往复循环,直到lo>=hi,然后把基准点的值放到hi这个位置。一次排序就完成了。以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。



public static int Partition(int []array,int lo,int hi){
//固定的切分方式
int key=array[lo];
while(lo<hi){
while((lo<high) && (array[hi]>=key)){//从右半部分向前扫描,保持lo不变,向左移动hi
hi--;
}
array[lo]=array[hi];//赋值即可,因为已经记下了key
while((lo<high) && (array[lo]<=key)){从左半部分向后扫描,保持hi不变,向右移动lo
lo++;
}
array[hi]=array[lo];//赋值即可,因为已经记下了key
}
array[hi]=key;
return hi;
}
public static void Qsort(int[] array,int lo ,int hi){
 if(lo>=hi) return ;
int index=Partition(array,lo,hi);
Qsort(array,lo,index-1);
Qsort(array,index+1,hi); }

public static void main(String[] args){
        int[] array={1,3,2,8,5,9,6};
Qsort(array,0,array.length-1);
}
            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: