簡體   English   中英

使用隨機 pivot C 實現就地快速排序

[英]inplace quicksort with random pivot C implementation

我需要實現一個使用隨機 pivot 的快速排序算法; 我正在使用大矩陣,所以我無法承受最壞的情況。

現在,我發現這個實現可以正常工作,但它使用 pivot 作為第一個元素。

我已經修改它以適應我的場景(我正在使用稀疏矩陣,我需要按“行索引,列索引”對元素進行排序),這就是我所擁有的:

void quicksortSparseMatrix(struct sparsematrix *matrix,int first,int last){
    
    int i, j, pivot, temp_I, temp_J;
    double temp_val;
    

    if(first<last){
        pivot=first;            //(rand() % (last - first + 1)) + first;
        
        i=first;
        j=last;     

        while(i<j){
            while(lessEqual(matrix,i, pivot)&&i<last)
                i++;
            while(greater(matrix,j, pivot))
                j--;
            if(i<j){   
                temp_I = matrix->I[i];
                temp_J = matrix->J[i]; 
                temp_val = matrix->val[i];
                matrix->I[i] = matrix->I[j];
                matrix->J[i] = matrix->J[j];
                matrix->val[i] = matrix->val[j];
                matrix->I[j]=temp_I;
                matrix->J[j]=temp_J;
                matrix->val[j]=temp_val;
            }
        
        }


    temp_I = matrix->I[pivot];
    temp_J = matrix->J[pivot]; 
    temp_val = matrix->val[pivot];
    matrix->I[pivot] = matrix->I[j];
    matrix->J[pivot] = matrix->J[j];
    matrix->val[pivot] = matrix->val[j];
    matrix->I[j]=temp_I;
    matrix->J[j]=temp_J;
    matrix->val[j]=temp_val;
    
    quicksortSparseMatrix(matrix,first,j-1);
    quicksortSparseMatrix(matrix,j+1,last);
    }
}

現在,問題是我正在使用的一些矩陣幾乎是排序的,並且算法運行得非常慢。 我想修改我的算法以使其使用隨機 pivot,但是如果我應用您在上面代碼中注釋的更改pivot=(rand() % (last - first + 1)) + first; ,算法沒有正確排序數據。

誰能幫我弄清楚如何更改算法以使用隨機 pivot 並對數據進行正確排序?

編輯:這是 struct sparsematrix 定義,我認為你不需要它,但為了完整性......

struct sparsematrix {
    int M, N, nz;   
    int *I, *J;
    double *val;
}; 

第一個比較應該小於(而不是小於等於),這也將消除檢查i < last的需要。 交換后,應該有i++j-- 最后兩行應該是quicksortSparseMatrix(matrix,first,j); quicksortSparseMatrix(matrix,i,last); , 對於 Hoare 分區方案的這種變體。 數組示例代碼:

void QuickSort(int *a, int lo, int hi)
{
int i, j;
int p, t;
    if(lo >= hi)
        return;
    p = a[lo + 1 + (rand() % (hi - lo))];
    i = lo;
    j = hi;
    while (i <= j){
        while (a[i] < p)i++;
        while (a[j] > p)j--;
            if (i > j)
                break;
            t = a[i];
            a[i] = a[j];
            a[j] = t;
            i++;
            j--;
    }
    QuickSort(a, lo, j);
    QuickSort(a, i, hi);
}

對矩陣索引數組進行合並排序可能更快:更多移動,更少比較。 合並排序需要第二個臨時索引數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM