(重要)数组的partition调整

题目描述

给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序。
例如,arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8, 9, …]。

思路

参考:《程序员代码面试指南》
将数组划分为两个区域,左侧区域为排好序的区域,右侧区域为剩下的区域。使用两个指针:指针u指向左侧区域的最后一个位置,指针p做从左到右的遍历。指针u的初值为0,指针1的初值为1。
当arr[u]!=arr[p]时,说明p的元素应该移到u+1的位置,所以令u++,并交换u和p的元素,然后令p++,继续看下一个位置。否则,直接令p++,直接看后面的位置。

代码

import java.util.*;
public class Main{
    public static void main(String []args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int []a = new int [n];
        for(int i = 0 ; i<n ; i++){
            a[i] = scanner.nextInt();
        }
        int u = 0;
        int p =  1;
        while(p<n){
            if(a[p] != a[u]){
                u++;
                swap(a,u,p);
            }
            p++;
        }
        for(int i = 0 ; i<n ; i++){
            System.out.print(a[i] + " ");
        }
        System.out.print("\n");
    }
    public static void swap(int []a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页