算法 十大排序 快排(单边扫描法)

算法 十大排序 快排(单边扫描法)

在学习快排之前首先要了解一个快排中的概念元主;

元主:

元主:我们可以通俗的理解为是一个被比较的数。

那么是怎么进行操作使得数组的每一个数与元主进行比较呢
比较之后得到了一个结果我们应该要如何进行处理呢?

现在我们默认元主的数组的第一项,而指针sp的初始位置是从第二项开始进行扫描的。
在这里插入图片描述
快排的这样处理的,把指针所在的位置对应的下标在数组中的数字与元主进行比较,那么比较的结果有小于等于和大于这三种结果。

我们要如何处理呢?我们发现在现有的条件下我们无法来处理我们比较出来的结果的。所以我们要做一个标识。
在这里插入图片描述
接下来,我们的指针从左至右依次进行扫描。
当sp指针所对应的数字比元主小时,sp向右移
在这里插入图片描述
当sp遇到的数字比元主大时,我们把sp对应的数字和bigger对应的数字进行交换,bigger向左边移动
在这里插入图片描述
然后在继续在进行比较结果为
在这里插入图片描述
这个时候bigger和sp交错了,而bigger和sp交错之后sp就可以停止移动了,

注意:在bigger和sp交错之后,bigger所对应的位置一定是最后一个小于元主的数(有一点迷惑的话自己可以多举几个例子看一下),在交错之后bigger所对应的数字和元主进行交换

在这里插入图片描述
在交换之后,bigger左边的数一定是比元主小的,右边的数一定是比元主大的,在这一次比较中我们就确定了5这个数的位置

而接下来,3 2 2 4这一部分和6 7 9这一部分同样可以进行递归求解。
如何进行递归呢?
首先我们到找到bigger这个位置

//参数是数组,起始位置和结尾位置,而返回的p是我们上面所求的bigger,
int p=potion(arr, len, end);//而确定一个p值就像前面所说的确定了一个数的位置
//得到p之后我们在递归确定下一个数字的位置
quickSort(arr, len, q-1 );//相当于前面的3 2  2 4这一部分
 quickSort(arr, q+1, end);//相当于前面的6 7  9这一部分

具体代码:

public class _03_快排单向扫描 {
	public static void main(String[] args) {
		int arr[]  = {5,2,9,7,6,3,4,2};
		quickSort(arr, 0, arr.length-1);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
  public static void quickSort(int[] arr,int len,int end) {
	       if(len<end) {
	    	  int q=potion(arr, len, end);
	    	  quickSort(arr, len, q-1 );
	    	  quickSort(arr, q+1, end);
	       }  
  }
  public static int potion(int[] arr,int len,int end) {
	  int sta = arr[len];
	  int sp=len+1;
	  int bigger=end;
	  while(sp<=bigger) {//右指针大于等于左指针
		  if(arr[sp]<=sta) {//左指针下标的数字是否比元组大
			  sp++;
		  }else {
			  awp(arr, sp, bigger);
			  bigger--;
		  }
	  }
	  //把元主移到右指针的下标的数子
	awp(arr, len, bigger);
	return bigger;  
  }
  public static  void awp(int[] arr,int le,int en) {
		 int temp=arr[le];
		 arr[le] = arr[en];
		 arr[en]=temp;
		
	}  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值