写一个函数,输入是一个数组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, 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));
}
}