为名称数组创建QuickSort

时间:2013-07-12 15:22:30

标签: java arrays quicksort

所以我正在为我的课程开发一个项目,目前我仍然在创建一个QuickSort类来对1000个名字的数组进行排序。我有一个模板,我正在使用我们在课堂上做的一个实验室,我们应该将它作为基础;但是在实验室中我们使用了一个整数数组,我正在努力解决它如何转换它以便它可以与字符串一起使用;名。感谢您的帮助或任何建议,代码如下。

更新后的帖子;所以我在我的Name类中进行了比较

 public int compareTo(Object other) {
        int result;
        if (name.equals(((Name) other).name))
            result = name.compareTo(((Name) other).name);
        else
            result = name.compareTo(((Name) other).name);

        return result;
    }

我试图重新使用我的QuickSort ..我正在努力使用交换方法。

    private ArrayList<Name> data;

public QuickSort(ArrayList<Name> initialValue){

    data=initialValue;
}

public void sort(ArrayList<Name> namelist, int i, int j){

    sort(0, data.size()-1);
}

public void sort(int from, int to){

    if (from >= to)
        return;
    int p = partition(from, to);
    sort(from, p);
    sort( p + 1, to);
}

private int partition(int from, int to){

    Name pivot = data.get(from);
    int i = from - 1;
    int j = to + 1;

    while(i<j){

        i++; while(data.get(i).compareTo(pivot) < 0) i++;
        j--; while(data.get(j).compareTo(pivot) < 0) j--;
        if(i<j) swap(i,j);

    }

    return j;
}

private void swap (int i, int j){

    Name temp = data.get(i);
    data.equals(i) = data.get(j);
    data = temp;

}

特别是“data.equals(i)= data.get(j)行和data = temp;我确信我做的事情很愚蠢。

更新

private void swap (int i, int j){

    Name temp = data.get(i);
    data.get(j).equals(data.get(i));
    data.get(j).equals(temp);

}

可能?

4 个答案:

答案 0 :(得分:1)

发布解决问题的代码很容易,但不会帮助您了解QuickSort(或其他排序算法)的含义。

QuickSort的核心是在这里交换元素:

while(i<j){
    i++; while(data[i] < pivot) i++;
    j--; while(data[j] > pivot) j--;
    if(i<j) swap(i,j);
}

如您所见,您正在将data数组的元素与pivot变量进行比较。由于他们是int,您可以使用<轻松比较它们。现在,您必须为String s做类似的事情。值得庆幸的是,String可以使用String#compareTo方法进行比较。我将为String提供此实现(否则我会将作业分配为我的= P)。

要获得更通用的问题解决方案,您有两种选择:

  • 让您的类实现Comparable接口,因此您将拥有compareTo方法。一个基本的 样本实施:

    public class Name implements Comparable<Name> {
        @Override
        public int compareTo(Name name) {
            return ... //comparison logic...
        }
    }
    

    在QuickSort中使用它

    pivot.compareTo(...);
    
  • 使用Comparator接口的实例。您将使用Comparator#compare。一个基本的示例实现:

    public class NameComparator implements Comparator<Name> {
        @Override
        public int compare(Name name1, Name name2) {
            return ... //comparison logic...
        }
    }
    

    在QuickSort中使用它

    NameComparator nameComparator = new NameComparator();
    nameComparator.compare(..., ...);
    

答案 1 :(得分:0)

您可以使用比较器:如果对象较小,相等或更大,Comparator.compare(o1,o2)将返回-1,0或1。

java中的字符串实际上是可比的,某种伴随接口:

 int compareTo(T other);

API执行:http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

答案 2 :(得分:0)

请注意,字符串比较是通过equals方法:

data.get(j) == pivot => data.get(j).equals(pivot)

答案 3 :(得分:0)

您必须设置一个String值才能将其与某些内容进行比较。因此,通过设置枢轴值以将其与自身进行比较,它将返回零。由于所有字符串不太可能等于您的透视值,因此与透视值相比的任何内容都将返回为-1或1.通过执行此操作,您的if语句将确定交换值的发送方式(更高或更低)然后您的支点值。

    ObjectQuickSorter sortStrings = new ObjectQuickSorter();
    sortStrings.sort(arrayHere);

    class ObjectQuickSorter{

    void sort(String[] array){
        doQuickSort(array, 0, array.length -1);
    }

    private static void doQuickSort(String[] array,int start, int end){
        int pivotPoint;

        if(start < end){
            pivotPoint = partition(array, start, end);

            doQuickSort(array, start, pivotPoint -1);

            doQuickSort(array, pivotPoint + 1, end);
        }
    }

    private static int partition(String[] array, int start, int end){
        String pivotValue;
        int endOfLeftList;
        int mid = (start + end)/2;

        swap(array, start, mid);

        pivotValue = array[start];

        endOfLeftList = start;

        for(int scan = start + 1; scan <= end; scan++){
            // trying to compare pivot = string value to array[scan] position value
            // doing this by setting pivot value compare to itself to return 0
            // then also comparing pivot value to array[scan] to return -1, 0, 1
            // if return is 0 or 1 then it ignores it
            if(  array[scan].compareTo(pivotValue) < array[start].compareTo(pivotValue)){
                endOfLeftList++;
                swap(array, endOfLeftList,scan);
            }
        }

        swap(array, start, endOfLeftList);

        return endOfLeftList;
    }

    private static void swap(String[] array, int a, int b){
        String temp;

        temp = array[a];
        array[a] = array[b];
        array[b] = temp;
    }
}