算法day02

98 阅读1分钟

1.荷兰国旗问题

定义:给定一个数组一个值target,将数组中按照<target,=target,>target分成三块区域,返回下标
public int[] flag(int[] nums,int target){
    int left = -1;//小于区末尾下标
    int right = nums.length;//大于区开始下标
    int help;
    for (int i = 0; i < right;) {
        if(nums[i]<target){
            //将当前位置与<区后一个做交换,<区向后一位
            help = nums[i];
            nums[i] = nums[left+1];
            nums[left+1] = help;
            left++;
            i++;
        }else if(nums[i]==target) i++;
        else {
            //将当前位置与大于区前一个元素做交换,i不动
            help = nums[i];
            nums[i] = nums[right-1];
            nums[right-1] = help;
            //将大于区起始下标向前一位
            right--;
        }
    }
    int[] res = {left,right};
    return res;
}

2.快排

 public void QuickSort(int[] nums,int left ,int right ){
        if(left>right) return;
        int i =left;
        int j =right;
        while (i!=j){
            while(nums[j]>=nums[left] && j>i){
                j--;
            }
            while (nums[i]<=nums[left] && j>i){
                i++;
            }
            exchange(nums,i,j);
        }
        exchange(nums,left,i);
        QuickSort(nums,left,i-1);
        QuickSort(nums,i+1,right);
    }

    public void exchange(int[] nums,int i,int j){
        int help = nums[i];
        nums[i] = nums[j];
        nums[j] = help;
    }
}
```
```