快速排序算法实现及改进(三向切分)【java】

快速排序算法【java】

快速排序属于交换排序的一种,是应用最广泛的排序算法了。快速排序是由冒泡排序改进而来的,在冒泡排序中只对相邻的两个元素进行比较,

(一)快速排序算法的优点:
(1)实现简单,适用于各种不同的输入数据,且在一般应用中比其他排序算法都要快的多。
(2)原地排序,也就是说快速排序只需要一个很小的辅助栈。且长度为N的数组排序所需要的时间与NlgN成正比。(时间复杂度小,空间复杂度也小。)
(3)排序的内循环比大多数排序算法都要短小,这意味着无论实在理论还是在实际上快速排序都要更快。

(二)快速排序算法的缺点:
(1)快速排序是不稳定的排序。
(2)快速排序算法非常的脆弱,在实现时必须非常小心,才能避免低劣的性能。

(三)快速排序算法的思想:
快速排序是一种分治的排序算法。它将一个数组分成两个子数组,递归的将两个子数组进行排序,当两个数组都有序时,整个数组自然也就有序了。切分的位置取决于数组的内容。
一般策略是:
(1)随意的地取a[lo](即数组的第一个元素)作为“切分元素”,即那个将会被排定的元素。
(2)我们从数组的右端开始向左扫描,直到找到一个小于“切分元素”的元素,再从数组的左端开始向右扫描,直到找到一个大于“切分元素”的元素,交换两个元素之间的位置。
(3)重复(1)(2)两步,我们就可以保证左指针i左边的元素都不大于切分元素,右指针j右侧的元素都不小于切分元素。
(4)当两个指针i和j相遇时,我们只需要将“切分元素”a[lo]和a[i](或者a[j]交换即可。)
(5)递归的重复“切分”过程。直到左指针指向右指针的右侧(即lo>hi)递归结束。
(四)举例描述快速排序的过程。
例如对数组{49 38 65 97 76 13 27 49}排序,49为“切分元素”。
第一趟排序结果:{27 38 13} 49 {76 97 65 49}
第二趟排序结果:{13}27{38} 49 {76 97 65 49}
第三趟排序结果:13 27 38 49 {49 65} 76 {97}
第四趟排序结果:13 27 38 49 49 {65} 76 97
(五)代码实现【java】
代码1:

import java.util.*;//导入必要的包
public class QS{
   
//定义交换函数
public static void swap(int a[],int i,int j){
   
	int temp;
	temp=a[i];
	a[i]=a[j];
	a[j]=temp;
	}
public static void quickSort(int[] a,int lo,int hi){
   
	//设计递归出口,传入的lo和hi碰头表示已经排好序了。
	if(lo>=hi){
   
		return;
		}//返回空表示终止。
	int i=lo;
	int j=hi;
	int v=a[lo];//将第一个元素设为"切分元素";
	while(i<j){
   
		while(a[j]>=v&&i<j){
   //从右边往左边找比切分元素小的
			j--;
			}
		while(a[i]<=v&&i<j){
   //从左边往右找比切分元素大的
			i++;
			}
		if(i<j){
   //交换
			swap(a,i,j);
			}
		}
		//i=j的情况。让标志位和a[i]或者a[j]交换。
	//a[lo]=a[i];
	//a[i]=v;
	swap(a,lo
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值