Interview Questions: Elementary Sorts

Elementary Sorts

Intersection of two sets. Given two arrays ?[] and ?[], each containing n distinct 2D points in the plane, design a subquadratic algorithm to count the number of points that are contained both in array ?[] and array ?[].

求两个坐标点集合的交集。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Intersection {
    public Node[] findIntersection(Node[] a, Node[] b) {
        int i = 0;
        int j = 0;
        List<Node> temp = new ArrayList<>();
        Arrays.sort(a);
        Arrays.sort(b);
        while (i < a.length && j < b.length) {
            if (a[i].compareTo(a[j]) < 0) {
                i++;
            } else if (a[i].compareTo(a[j]) > 0) {
                j++;
            } else {
                temp.add(a[i]);
                i++;
                j++;
            }
        }

        Node[] res = new Node[temp.size()];
        for (int k = 0; k < temp.size(); k++) {
            res[k] = temp.get(k);
        }
        return res;
    }

    private class Node implements Comparable<Node>{
        private int x;
        private int y;

        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public boolean equals(Object obj) {
            Node that = (Node) obj;
            if (this.x == that.x && this.y == that.y) {
                return true;
            }
            return false;
        }

        @Override
        public int compareTo(Node o) {
            if (this.x < o.x) {
                return -1;
            } else if (this.x > o.x) {
                return 1;
            } else if (this.y < o.y) {
                return -1;
            } else if (this.y > o.y) {
                return 1;
            } else {
                return 0;
            }
        }
    }
}

Permutation. Given two integer arrays of size n, design a subquadratic algorithm to determine whether one is a permutation of the other. That is, do they contain exactly the same entries but, possibly, in a different order.

排序后判断是否为相同数组。

import java.util.Arrays;

public class Permutation {
    public boolean judge(int[] a, int[] b) {
        shellSort(a);
        shellSort(b);
        return Arrays.equals(a, b);
    }

    private void shellSort(int[] a) {
        int n = a.length;
        int h = 1;
        while (h < n / 3) {
            h = h * 3 + 1;
        }
        while (h >= 1) {
            for (int i = h; i < n; i++) {
                int j = i;
                int temp = a[i];
                while (j >= h && temp < a[j - h]) {
                    a[j] = a[j - h];
                    j -= h;
                }
                a[j] = temp;
            }
            h /= 3;
        }
    }
}

Dutch national flag. Given an array of n buckets, each containing a red, white, or blue pebble, sort them by color. The allowed operations are:

  • swap(i, j): swap the pebble in bucket ii with the pebble in bucket j.
  • color(i): determine the color of the pebble in bucket i.

The performance requirements are as follows:

  • At most n calls to color().
  • At most n calls to swap().
  • Constant extra space.

将数组重新排序为三个从大到小的区间。把0全部换到数组前半段,把2全部换到数组后半段,自然就排好了序。

public class Dutch {
    public void partition(int[] a) {
        int left = 0;
        int right = a.length - 1;
        int i = 0;
        while (i <= right) {
            if (a[i] == 0) {
                swap(a, left++, i++);	// 调换后i处只可能为0或1,所以可以i++
            } else if (a[i] == 2) {
                swap(a, right--, i);	// 调换后i处可能为0或1或2,需要在下个循环再次对i进行判断
            } else {
                i++;
            }
        }
    }

    private void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值