荷兰国旗
要点:指针在移动时,
1.如果指针对应的值小于给定值,左标记和指针均向右移
2…如果指针对应的值等于给定值,指针右移
3…如果指针对应的值大于给定值,右标志位左移
package Test;
public class 荷兰国旗{
public static void main(String[] args) {
int arr[] = new int[]{2,3,8,4,8,2,4,2,7,5,9,2,3,4,5};
partition(arr,5);
for (int i : arr) {
System.out.println(i);
}
}
public static int[] partition(int[] arr, int num) {
if(arr == null || arr.length < 2){
return arr;
}
int less = 0;
int more = arr.length;
int i = 0;
while (i < more) {
if (arr[i] < num) {
swap(arr, less++, i++);
} else if (arr[i] > num) {
swap(arr, --more, i);
}else {
i++;
}
}
//返回等于num数据的位置
return new int[] { less + 1, more - 1 };
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
快速排序
要点,完成一个方法
这个方法需要将:
以数组中央的值为基准,左边变成小于基准的。右边均是大于基准的
并且返回一个该基准最后的位置
例如 arr【54251541】 中间值为5 处理后
5那个位置左边都是小于等于5的,右边都是大于等于5的
package Test;
public class Run {
public static void main(String[] args) {
int arr[] = new int[]{-9,5,6,4,7,-574,70};
//-9,5,6,4,7,-574,70
//-574,-9,4,6,7,5,70
//-9,5,6,4,7,-574,70
partition(arr, 0, arr.length-1);
for (int i : arr) {
System.out.println(i);
}
}
private static void partition(int[] arr, int l, int r) {
int i = dealArr(arr, l, r);
if(l<i-1)
partition(arr,l,i-1);
if(i+1<r)
partition(arr,i+1,r);
}
private static int dealArr(int[] arr, int l, int r) {
int midNum = arr[(r+l)/2];
int tmp;
while(l<r){
//找出左边第一个大于或等于midNum的角标
while(arr[l]<midNum){
l++;
}
if(l==r){
break;
}
//找出右边第一个小于或等于midNum的角标
while(arr[r]>midNum){
r--;
}
tmp=arr[l];
arr[l]=arr[r];
arr[r]=tmp;
}
return r;
}
}