快速排序

基本思路:
数组int[] nums 左边界left 右边界right (三个参数, 时间复杂度:[ NlogN ])

  1. 找一个基准数,一般以最左边的数作为基准数 base=nums[left]
  2. 右索引从右开始往左搜索,找到第一个比基准数小的数,暂停;左索引从左往右搜索第一个比基准数大的数,暂停;
    交换两个数的位置;
  3. 继续从右往左,从左往右寻找,然后继续交换,直到左右索引相遇,退出;
  4. 交换基准数和相遇位置的数,此时基准数左边的数全部小于等于基准数,右边的全部大于等于基准数
  5. 再对左右两边进行递归排序,求解
  6. 当左边界大于右边界时,退出
public void quickSort(int[] nums,int left,int right){
		if(left>right){ //左边界大于右边界
			return;
		}
		int base=nums[left]; // 以最左边的数作为基准数  
		int i=left,j=right; // 设置左右索引
		while(i!=j){     // 循环交换右小左大的数,直到相遇
			while(nums[j]>=base&&j>i){ // 找到右边第一个比基准数小的数
				j--;
			}
			while(nums[i]<=base&&i<j){  //左边第一个比基准数大的数
				i++;
			}
			int temp=nums[i];   //  交换右大左小的位置
			nums[i]=nums[j];
			nums[j]=temp;
	    }
      nums[left]=nums[i]; // 交换基准数和相遇位置的数
	  nums[i]=base;
	  quickSort(nums,left,i-1); //  左边的全比基准数小,基准数右边的全比基准数大,递归求解左右两边
	  quickSort(nums,i+1,right);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值