Java快速排序

Java快速排序,思路:选择一个基准数将数组利用递归二分,直到数组不能再分为止;

步骤:(降序)

1、选择一个基准数(本文选择数组第一个数作为基准数);(后面称基准数为A)

2、用A将数组分为2部分:比A小的在右边,比A大的在左边;经过这一步 操作之后,就将整个数组分为了2个数组;

3、分别对左右两边的数组,重复上诉1,2步操作;

4、退出递归的条件,数组长度length =1;

实现代码:

	public void xx(int a[],int left,int right) {
		
		
		if(left < right) {//递归出口条件判断
			int x = a[left];		
			int i=left;
			int j = right;

//整个循环目的:用基准数x,将数组分为2个部分(准确来讲是3部分->【左数组】,x,【右数组】)
			while(i<j) {
				/**从后往前比较*/
				while(i < j && a[j] <= x)
					j--;
				if(i < j) {
					a[i]=a[j];
					i++;
				}
				
				/**从前往后比较*/
				while(i<j && a[i] > x) 
					i++;
				if(i<j) {
					a[j]=a[i];
					j--;				
				}
			}		
			a[i]=x;		
			xx(a,left,i-1);//左边数组
			xx(a,i+1,right);//右边数组

			}
		
	}

以上就是快速排序的实现;

之前在知乎上看到一个问题,如何利用快速排序找一个乱序数组的中位数?

这个问题给出一个条件:在确定数组,可以已知中位数对应的下标;这个问题其实可以转化为求确定下标对应的数值;

从上面的算法中很容易看出,其实快速排序每一次都会给出基准数在该数组排序之后的正确下标;

利用快速排序求数组中位数的思路:

1、算出中位数下标:M

2、以数组第一个数作为基准数,找出该基准数的下标B,与M相比较,找出中位数所在数组;

3、重复步骤2,

4、递归出口:B==M,数组长度length=1;


代码实现:(升序)

	public int midian(int []a,int left,int right,int target) {
		
		
		if(left < right) {
			
			int i = left;
			int j = right;			
			int x = a[left];
			
			while(i < j ) {
				
				while(i < j && a[j] >= x)
					j--;
				if(i<j) {
					a[i]=a[j];
					i++;					
				}
				
				while(i < j && a[i] <= x)
					i++;				
				if(i<j) {
					a[j]=a[i];
					j--;					
				}
			}			
			a[i] = x;
			/**在每次定位好基准数之后,比较下标*/
			if(i == target)
				return a[i];									
			if(i > target) {
				return	midian(a,left,i-1,target);				
			}				
			if(i<target) {
				return	midian(a,i+1,right,target);
			}
		}
		return a[left];
		
		
	}
	

其中target是中位数下标,这个在给定数组之后自己可以算出;

这里有个问题,如果数组元素是偶数,中位数应该是最中间2个数的平均值,应该2次求解找平均值;

可以改进这个算法;







Java快速排序的实现可以使用递归的方式来实现。快速排序的基本思想是选取一个基准元素,然后将数组中小于基准元素的数放在左边,大于基准元素的数放在右边,再对左右两个子数组分别进行快速排序,直到整个数组有序为止。 下面是Java快速排序的示例代码: ```java public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } } public static int partition(int[] arr, int left, int right) { int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {5, 4, 3, 2, 1}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5] } } ``` 在上面的代码中,`quickSort()` 方法调用了 `partition()` 方法来选取基准元素并进行分区,然后再递归调用 `quickSort()` 方法对左右两个子数组进行快速排序。`partition()` 方法中使用了双指针来确定小于基准元素和大于基准元素的分界点,并将小于基准元素的数放在左边,大于基准元素的数放在右边。最后,将基准元素和分界点的数交换位置,并返回分界点的位置。 运行结果为 `[1, 2, 3, 4, 5]`,说明快速排序算法成功地对数组进行了排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值