每天一道算法题——数组重排序

写一个函数,输入是一个数组A, 以及下标i,要求函数将数组的元素进行调整,使得所有比A[i]小的元素排在前面,接着是所有等于A[i]的元素,最后排列的是所有大于A[i]的元素。例如给定A = 2 4 3 7 5 5 8 3. i = 5. 于是得到调整后的数组为:2 4 3 3 5 5 7 8
要求算法的空间复杂度是O(1),时间复杂度是O(n).

首先将基准值存入变量pivot当中,接下来创建两个指针begin,end,分别指向数组的头和尾。
如果arr[begin] >= pivot,就将arr[begin]与arr[end]交换,end--;否则begin++。这样在一次遍历之后就可以将数组分成小于基准值的一部分和大于等于基准值的一部分。这是从 大于等于基准值的那部分再遍历一次数组,如果arr[begin] > pivot,就将arr[begin]与arr[end]交换,end--;否则begin++。这样就可以实现算法了。
例如:2 4 3 7 5 5 8 3, pivot = 5;
begin-> 2 4 3 7 5 5 8 3<-end
arr[begin] < pivot, begin++ : 2 4 3 7 5 5 8 3
arr[begin] < pivot, begin++ : 2 4 3 7 5 5 8 3
arr[begin] < pivot, begin++ : 2 4 3 7 5 5 8 3
arr[begin] >= pivot, end-- : 2 4 3 3 5 5 8 7
arr[begin] >= pivot, end-- : 2 4 3 3 5 5 8 7
arr[begin] >= pivot, end-- : 2 4 3 3 8 5 5 7
arr[begin] >= pivot, end-- : 2 4 3 3 5 8 5 7
第二步与第一步一样,只是判断条件由arr[begin] >= pivot变成arr[begin] > pivot。

下面是代码实现:
package p_10_arrayresort;

import java.util.Scanner;

public class ResortArray {

	private int record = 0;
	
	public int[] reSort(int[] arr, int index){
		if(arr.length <= 1){
			return arr;
		}
		
		int pivot = arr[index];
		arr = reSortArr(arr, 0, arr.length-1, pivot, false);
		for(int i=0;i<arr.length;i++){
			if(arr[i]>=pivot){
				record = i;
				break;
			}
		}
		arr = reSortArr(arr, record, arr.length-1, pivot, true);
		return arr;
	}
	public int[] reSortArr(int[] arr, int start, int end,int pivot, boolean checked){
		
		
		if(start > end || pivot>arr.length){
			throw new IllegalArgumentException("this is a error number!");
		}
		if(start == end){
			return arr;
		}
		
		while(start < end){
			if((arr[start] >= pivot && !checked)  || (arr[start] > pivot && checked)){
				swap(arr, start, end);
				end--;
			}else{
				start++;
			}
		}

		return arr;
	}
	
	public void printArr(int[] arr){
		for(int e:arr){
			System.out.print(e+" ");
		}
		System.out.println();
	}
	public static void swap(int[] arr, int start, int end){
		arr[start] = arr[end] - arr[start]+(arr[end] = arr[start]);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	int index = in.nextInt();
	int[] arr = new int[n];
	for(int i=0; i<n; i++) {
		arr[i] = in.nextInt();
	}
	
	ResortArray ra = new ResortArray();
	ra.printArr(ra.reSort(arr, index));

	}

}

将改动过程也贴上去,mark一下


package p_10_arrayresort;

import java.util.Scanner;

public class ResortArray {

	private int record = 0;
	
	public int[] reSort(int[] arr, int index){
		if(arr.length <= 1){
			return arr;
		}
		
		int pivot = arr[index];
		arr = reSortArr(arr, 0, arr.length-1, pivot, false);
		for(int i=0;i<arr.length;i++){
			if(arr[i]>=pivot){
				record = i;
				break;
			}
		}
		arr = reSortArr(arr, record, arr.length-1, pivot, true);
		return arr;
	}
	public int[] reSortArr(int[] arr, int start, int end,int pivot, boolean checked){
		//int pivot = arr[index];
		
		if(start > end || pivot>arr.length){
			throw new IllegalArgumentException("this is a error number!");
		}
		if(start == end){
			return arr;
		}
		/*
		 * if(arr.length <= 1){
		 * 		return arr;
		 * }
		 * */
		while(start < end){
			if((arr[start] >= pivot && !checked)  || (arr[start] > pivot && checked)){
				swap(arr, start, end);
				end--;
			}else{
				start++;
			}
		}
//		while( (start<end && !checked) || (start<end && checked) ){
//			if(checked == false){
//				if(arr[start] >= pivot){
//					swap(arr, start, end);
//					end--;
//				}else{
//					start++;
//				}
//			}else{
//				if(arr[start] > pivot){
//					swap(arr, start, end);
//					end--;
//				}else{
//					start++;
//				}
//			}
//		}
//		for(int i=0;i<arr.length;i++){
//			if(arr[i]>=pivot){
//				record = i;
//				break;
//			}
//		}
		//record = start;
		return arr;
	}
	
	public void printArr(int[] arr){
		for(int e:arr){
			System.out.print(e+" ");
		}
		System.out.println();
	}
	public static void swap(int[] arr, int start, int end){
		arr[start] = arr[end] - arr[start]+(arr[end] = arr[start]);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	int index = in.nextInt();
	int[] arr = new int[n];
	for(int i=0; i<n; i++) {
		arr[i] = in.nextInt();
	}
	
	ResortArray ra = new ResortArray();
	ra.printArr(ra.reSort(arr, index));
//	ra.printArr(ra.reSortArr(arr, 0, arr.length-1, 5, false));
//	ra.printArr(ra.reSortArr(arr, ra.record, arr.length-1, 5, true));
	
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值