[英]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.