【问题标题】:My QuickSort and MergeSort are not functioning Properly我的 QuickSort 和 MergeSort 无法正常运行
【发布时间】:2015-07-13 04:25:53
【问题描述】:

当段的大小

这是我的插入排序函数,用于上下文:

int ndxCopy = 0, ndx, ndxSort, comp, result, ndxProper;
String sortMe = null;
for (ndx = (1 + firstIndex); ndx < numberToSort; ndx++) {
    sortMe = data.get(ndx);
    for (ndxSort = firstIndex; ndxSort < ndx; ndxSort++) {
        comp = sortMe.compareTo(data.get(ndxSort));
        if (comp < 0) {
            ndxProper = ndxSort;
            for (ndxCopy = ndx; ndxCopy > ndxProper; ndxCopy--)
                data.set(ndxCopy, data.get(ndxCopy - 1));

            data.set(ndxProper, sortMe);
        }
    }
}

这是我的快速排序:

if (numberToSort <= 15)
    insertionSort(data, firstIndex, numberToSort);
else {
    int partitionNdx = partition(data, firstIndex, numberToSort);

    int sizeLeft = (partitionNdx - firstIndex);
    int sizeRight = (numberToSort - sizeLeft - 1);

    quickSort(data, firstIndex, sizeLeft);
    quickSort(data, (firstIndex + sizeLeft + 1), sizeRight);
}

这是我的分区: medianOfThree 方法只是随机数在索引范围内生成 3 个数字,将 3 个值存储在这些索引处,并使用中值作为枢轴...

int pivotNdx = medianOfThree(data, firstIndex, numberToPartition);
String temp = data.get(firstIndex);
String pivot = data.get(pivotNdx);

data.set(firstIndex, pivot);
data.set(pivotNdx, temp);

int TooBigNdx = (firstIndex + 1), TooSmallNdx = (firstIndex + numberToPartition - 1);

while (TooBigNdx < TooSmallNdx) {
    while ((TooBigNdx < TooSmallNdx) && ((data.get(TooBigNdx)).compareTo(pivot) <= 0))
        TooBigNdx++;

    while ((TooSmallNdx > firstIndex) && ((data.get(TooSmallNdx)).compareTo(pivot) > 0))
        TooSmallNdx--;

    if (TooBigNdx < TooSmallNdx) {
        temp = data.get(TooSmallNdx);
        String TooBig = data.get(TooBigNdx);

        data.set(TooSmallNdx, TooBig);
        data.set(TooBigNdx, temp);
    }

}

if (pivot.compareTo(data.get(TooSmallNdx)) >= 0) {
    temp = data.get(firstIndex);
    String TooSmall = data.get(TooSmallNdx);

    data.set(firstIndex, TooSmall);
    data.set(TooSmallNdx, temp);

    return TooSmallNdx;
} else
    return firstIndex;

这是我的 MergeSort 方法:

if (numberToSort <= 15)
    insertionSort(data, firstIndex, numberToSort);
else {
    int sizeLeft = (numberToSort / 2);
    int sizeRight = (numberToSort / 2) + (numberToSort % 2);

    mergeSort(data, firstIndex, sizeLeft);
    mergeSort(data, (firstIndex + sizeLeft), sizeRight);

    merge(data, firstIndex, sizeLeft, sizeRight);
}

这是我的合并方法:

ArrayList<String> temp = new ArrayList<String>();
int ndxTemp = 0, ndxLeft = firstIndex, ndxRight = (firstIndex + leftSegmentSize), comp, ndx;
String left, right;
int sizeLeft = leftSegmentSize, sizeRight = rightSegmentSize;

while ((sizeLeft > 0) || (sizeRight > 0)) {
    if ((sizeLeft > 0) && (sizeRight > 0)) {
        left = data.get(ndxLeft);
        right = data.get(ndxRight);

        comp = left.compareTo(right);
        if (comp <= 0) {
            temp.add(data.get(ndxLeft++));
            sizeLeft--;
        } else {
            temp.add(data.get(ndxRight++));
            sizeRight--;
        }
    } else {
        if (sizeLeft > 0) {
            temp.add(data.get(ndxLeft++));
            sizeLeft--;
        } else {
            temp.add(data.get(ndxRight++));
            sizeRight--;
        }
    }
}

ndx = firstIndex;
for (ndxTemp = 0; ndxTemp < temp.size(); ndxTemp++)
    data.set(ndx++, temp.get(ndxTemp));

请帮我找出问题所在...

【问题讨论】:

    标签: java string sorting arraylist quicksort


    【解决方案1】:

    我的问题的根源竟然在这行代码中:

    for (ndx = (1 + firstIndex); ndx < numberToSort; ndx++) {
    

    特别是:

    ndx < numberToSort
    

    这应该是:

    ndx < (numberToSort + firstIndex), as we are not necessarily starting at 0.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2020-09-30
      • 2020-09-26
      • 2017-08-02
      • 2019-03-10
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多