快速排序--Java实现

快速排序:

方法一:以第一个数为基数,定义两个数,一个记录从后往前遍历的下标,一个记录从前往后遍历的下标,先从后往前遍历,找到一个数比基数小的值,记录下标,在从前往后遍历,找到一个比基数大的数,记录下标,交换两个数的位置,再继续遍历,先从后往前,再从前往后,一直到两个记录下标的数相等,则交换基数和该下标对应的数的位置,即该下标的数变成了第一个数(因为是先从后往前的,所以该下标对应的数肯定是小于基数的,自己可以举例),这样就是一轮排序,然后再递归排序基数左边和右边的子数组(基数的下标为最后的下标记录)

方法二:选第一个数为基数,先从后往前遍历,找到一个数比基数小的,交换基数和该数的位置,再从前往后遍历,找到一个数比基数大,交换基数和该数的位置,以此类推,直到前后连个记录下标相等,这样为一次遍历,再递归基数左边和右边的子数组

package Sort;
/*
 * 快速排序
 */
public class SortTest1 {

	public static void main(String[] args) {
		int[] arr={3,1,2,5,6,1,3,8,4,9,2,-1,5,-6,0};
//		int[] arr={2,1,1,1,1,1,1,1};
		for(int i:arr){
			System.out.print(i+" ");
		}
		System.out.println();
//		new SortTest1().quickSort(arr, 0, arr.length-1);
		new SortTest1().quickSort2(arr, 0, arr.length-1);
		for(int i:arr){
			System.out.print(i+" ");
		}
	}

	//方法一
	public void quickSort(int[] arr,int start,int end){
		if(arr==null||start>=end){
			return;
		}
		int temp=arr[start];
		int i=start;
		int j=end;
		while(j>i){
			while(j>i&&arr[j]>=temp){
				j--;
			}
			while(j>i&&arr[i]<=temp){
				i++;
			}
			if(j>i){
				int t=arr[j];
				arr[j]=arr[i];
				arr[i]=t;
			}
		}
		arr[start]=arr[i];
		arr[i]=temp;
		quickSort(arr, start, i-1);
		quickSort(arr, i+1, end);
	}

	//方法二
	public void quickSort2(int[] arr,int start,int end){
		if(arr==null||start>=end){
			return;
		}
		int key=arr[start];
		int low=start;
		int high=end;
		while(high>low){
			while(high>low&&arr[high]>=key){
				high--;
			}
			if(arr[high]<key){
				int temp=arr[low];
				arr[low]=arr[high];
				arr[high]=temp;
			}
			while(high>low&&arr[low]<=key){
				low++;
			}
			if(arr[low]>key){
				int temp=arr[low];
				arr[low]=arr[high];
				arr[high]=temp;
			}
		}
		
		if(low>start)
			quickSort2(arr, start, low-1);
		if(low<end){
			quickSort2(arr, low+1, end);
		}
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值