[算法]数组的partition调整

时间:2021-07-22 18:53:09

题目一:

给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复部分且升序,而不用保证右部分是否有序。

例如:arr=[1,2,2,2,3,3,4,5,6,6,7,7,8,8,9,9],调整之后arr=[1,2,3,4,5,6,7,8,9…]。

要求:

时间复杂度O(N),额外空间复杂度O(1)

程序:

public static void leftUnique(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int u = 0;
int i = 1;
while (i != arr.length) {
if (arr[i++] != arr[u]) {
swap(arr, ++u, i - 1);
}
}
}

题目二:

给定一个数组arr,其中只可能含有0、1、2三个值,请实现arr的排序。

另外一种问法:有一个数组,其中只有红球、篮球和黄球,请实现红球全放在数组的左边,篮球放在中间,黄球放在右边。

另外一种问法:有一个数组,再给定一个值K,请实现比K小的数都放在数组的左边,等于K的值都放在数组的中间,比K大的数都放在数组的右边。

程序:

public static void sort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int left = -1;
int index = 0;
int right = arr.length;
while (index < right) {
if (arr[index] == 0) {
swap(arr, ++left, index++);
} else if (arr[index] == 2) {
swap(arr, index, --right);
} else {
index++;
}
}
}