java中的3个中间快速排序

时间:2016-03-23 13:34:27

标签: java eclipse quicksort

我在大学里有一项任务,我需要使用 3个中间快速排序按组编号对学生进行排序。但我的排序方法不能正常工作 - 只有一些元素被排序。但是一些元素并没有改变他们的立场。 我创建了一个带有必要数据的 Student 类,带有 Student 类型数组的 Sortings 类。我在主类中有4种静态方法用于这种类型的排序,我在其中创建排序的实例并调用我的静态方法进行排序。

public static void manual_Sort(Student[]st, int right, int left)
{
    int size = right - left + 1;
    if(size <= 1)
        return;             
    if(size == 2)
    {
        if(st[left].Group_number > st[right].Group_number)
            swap(st,right,left);
        return;
    }
    else
    {
        if(st[left].Group_number > st[right-1].Group_number)
            swap(st,left, right-1);                                 
        if(st[left].Group_number > st[right].Group_number)
            swap(st,left, right);                                       
        if(st[right-1].Group_number > st[right].Group_number )
            swap(st,right-1, right);                                
    }
}


public static int partitionIt(Student[]st, int left, int right,double pivot)
{
    int leftPtr = left;                 
    int rightPtr = right - 1;       

    while(true)
    {
        while(st[++leftPtr].Group_number < pivot)       
            ;
        while(st[--rightPtr].Group_number > pivot)      
            ;
        if(leftPtr >= rightPtr)         
            break;
        else
            swap(st,leftPtr, rightPtr); 
    }
    swap(st,leftPtr, right-1);              
    return leftPtr;                     
}

public static int median_OfThree(Student[]st, int left, int right)
{
    int center = (left + right)/2;

    if(st[left].Group_number > st[center].Group_number )
        swap(st,left, center);
    if(st[left].Group_number > st[right].Group_number )
        swap(st,left, right);
    if(st[center].Group_number > st[right].Group_number )
        swap(st,center, right);

    swap(st,center, right-1);                   
    return st[right-1].Group_number;                        
}

public static void quick_Sort(Student[] st)
{
    rec_quickSort(st, 0, st.length-1);
}

public static void rec_quickSort(Student[]st, int left, int right)
{
    int size_ = right - left + 1;

    if(size_ <= 3)
        manual_Sort(st, left, right);
    else
    {
        double median = median_OfThree(st, left, right);
        int partition = partitionIt(st, left, right, median);
        rec_quickSort(st, left, partition - 1);
        rec_quickSort(st, partition + 1, right);
    }
}

0 个答案:

没有答案