快速排序的两种实现方式

这篇博客详细介绍了快速排序算法的两种实现方法:一种是基于相互覆盖的元素交换,另一种是直接交换类型。每种实现都包括了主函数、快速排序函数和分区函数的详细步骤。通过递归调用,这两种方法都能有效地对数组进行排序,并在最后展示了排序后的数组输出。
摘要由CSDN通过智能技术生成

快速排序的两种实现方式

相互覆盖类

public class quickSort1 {
    public static void main(String args[])
    {
        int[] array = {2,3,1,4,5,7,5,8,9,10};
        quickSort(0,array.length-1,array);
        for(int i : array)
        {
            System.out.println(i);
        }

    }
    public static void quickSort(int low,int high,int[] array)
    {
       	//定义递归结束条件,当low>=high的时候,说明只有1个元素
      	if(low>=high)
      	{
      		return ; //直接返回
      	}else{
      		int index = partiton(low,high,array);
      		//给左侧子序列做快排
      		quickSort(low,index-1,array);
      		//给右侧子序列做快排
      		quickSort(index+1,high,array);
      	}
    }
    public static int  partition(int low,int high,int[] array)
    {
    //以数组的
       	int key = array[low];
       	while(low<high)
       	{
       		//从后往前遍历,如果 array[high] > key,high--
       		while((array[high]>key)&&(high>low))
       		{
       			high--;
       		}
       		//如果此时low<high,说明array[high]是一个小于key的数
       		//把array[high]赋值给array[low](正好是key)
       		if(low<high)
       		{
       			array[low] = array[high];
       		}
       		//从前到后,如果array[low]<key,low++
       		while((array[low]<key)&&(high>low))
       		{
       			low++;
       		}
       		//如果此时low<high,说明array[low]是一个大于key的数
       		//把array[low]赋值给array[high](之前已经覆盖到了前面),从而完成了交换
       		if(low<high)
       		{
       			array[high] = array[low];
       		}
       	}
       	//在遍历的时候严格限制了low<high,因此在这里就只有一种情况,即low==high,此时low的位置就是基准key的位置
       	array[low] = key;
       	return low; //把新的位置返回
    }
}

直接交换类型

public class quickSort2 {
    //快拍第二种实现方式,交换
    public static void main(String args[])
    {
        int[] array = {10,9,8,7,6,5,4,3,2,1};
        quickSort(0,array.length-1,array);
        for(int i : array)
        {
            System.out.print(i+" ");
        }
        System.out.println();
    }
    public static void quickSort(int low,int high,int[] array)
    {
        //递归终止条件
        if(low>=high)
        {
            return ;
        }if(low<high)
        {
            int index = partition(low,high,array);
            //左侧子序列 快排
            quickSort(low,index-1,array);
            //右侧子序列 快拍
            quickSort(index+1,high,array);
        }
    }
    public static int  partition(int low,int high,int[] array)
    {
    	//先定义基准值
    	int key = array[low];
    	int keyValue = low;
    	//开始partition
    	while(low<high)
    	{
    		//从后向前遍历,如果array[high] > key,high--
    		while((array[high]>key)&&(low<high))
    		{
    			high--;
    		}
    		//如果array[low] > key ,high++
    		while((array[low]<=key)&&(low<high))
    		{
    			low++;
    		}
    		/*
    		此时只有两种情况:
    		1、low<high 说明array[low]和array[high]一个大一个小,符合交换条件
    		1、low == high,说明array[low]和array[high]在同一位置无影响
    		*/
    		//执行交换
    		int temp = array[low];
    		array[low] = array[high];
    		array[high] = temp;
    	} 
    	//这个时候low==high但有两种情况
    	/*
    	 1、array[low] = array[high] >key
    	 2、array[low] = array[high] <key
    	*/
    	if(array[low]>key)
    	{
    		//array[low-1]与key互换
    		array[keyValue] = array[low-1];
    		array[low-1] = key;
    		//返回index low-2
    		return low-1;
    	}else
    	{
    		//array[low]与key互换
    		array[keyValue] = array[low];
    		array[low] = key;
    		//返回index low
    		return low;
    	}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值