【问题标题】:How do I add comparisons and switches to quicksort and merge sort?如何添加比较和切换到快速排序和合并排序?
【发布时间】:2015-01-20 03:13:02
【问题描述】:

我为快速排序和归并排序创建了代码,现在我尝试在代码中添加比较计数和切换计数,但我不知道在哪里添加“comparisons++”和“switches++”。

我的快速排序代码

public void quickSort( int start, int finish )
{
    comparisons = 0;
    switches = 0;
    int[] temp = new int[numbers.length];
    int lowSpot = start;
    int hiSpot = finish;
    int pivot = (int)(Math.random()*(finish+1-start)) + start;
    for( int i = start; i <= finish; i++ )
    {
        if( i != pivot )
        {
            if( numbers[i] <= numbers[pivot] )
            {
                temp[lowSpot] = numbers[i];
                lowSpot++;
            }
            else
            {
                temp[hiSpot] = numbers[i];
                hiSpot--;
            }
        }
    }
    temp[lowSpot] = numbers[pivot];
    for( int j = start; j <= finish; j++ )
    {
        numbers[j] = temp[j];
    }

    if( start < lowSpot - 1 )
    {
        quickSort( start, lowSpot - 1 );
    }
    if( hiSpot + 1 < finish )
    {
        quickSort( hiSpot+1, finish );
    }
    }

我的合并和归并排序代码

public int[] merge( int[] one, int[] two )
{
    comparisons = 0;
    switches = 0;
    one = mergeSort( one );
    two = mergeSort( two );
    int[] merged = new int[one.length+two.length];
    int oneLoc = 0;
    int twoLoc = 0;
    for( int i = 0; i < merged.length; i++ )
    {
        if( oneLoc < one.length && twoLoc < two.length )
        {
            if( one[oneLoc] <= two[twoLoc] )
            {
                merged[i] = one[oneLoc];
                oneLoc++;
            }
            else
            {
                merged[i] = two[twoLoc];
                twoLoc++;
            }
        }
        else if( oneLoc < one.length )
        {
            merged[i] = one[oneLoc];
            oneLoc++;
        }
        else
        {
            merged[i] = two[twoLoc];
            twoLoc++;
        }
    }
    return merged;
}

public int[] mergeSort( int[] temp )
{
    if( temp.length == 1 )
    {
        return temp;
    }
    else if( temp.length == 2 )
    {
        if( temp[0] > temp[1] )
        {
            int holder = temp[0];
            temp[0] = temp[1];
            temp[1] = holder;
        }
        return temp;
    }
    else
    {
        int mid = temp.length / 2;
        int[] first = new int[mid];
        int[] second = new int[temp.length-mid];
        for( int i = 0; i < temp.length; i++ )
        {
            if( i < mid )
            {
                first[i] = temp[i];
            }
            else
            {
                second[i-mid] = temp[i];
            }
        }
        return merge( first, second );
    }
    }

【问题讨论】:

    标签: java quicksort mergesort


    【解决方案1】:

    比较是当您...比较变量时(即 start

    【讨论】:

    • 所以为了快速多特,我是否只将比较放在 quickSort(start, lowSpot - 1);或者在快速排序(hiSpot+1,完成)之后;和 temp[lowSpot] = numbers[i];低点++;我会把开关放在 temp[hiSpot] = numbers[i]; 之后吗? hiSpot——; ?
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2010-10-04
    • 1970-01-01
    • 2015-05-21
    • 2021-01-19
    • 2012-08-26
    • 2016-12-08
    • 2012-08-19
    相关资源
    最近更新 更多