[英]C quicksort segmentation fault
我想用 c 編寫快速排序代碼,當我嘗試運行此代碼時,編譯器會抱怨“分段錯誤(核心轉儲)”。 我找不到問題出在哪里。 有人可以幫我找到問題嗎? 謝謝。
#include <stdio.h>
void swap(int *m,int *n)
{
int t;
t = *m;
*m = *n;
*n = t;
}
int partition(int *a,int lo,int hi)
{
int pivot = a[hi];
int i = lo;
for(int j = lo;j < hi;j++)
{
if(a[j] < pivot)
{
//swap(&a[i],&a[j]);
int t = a[i];
a[i] = a[j];
a[j] = t;
i++;
}
}
// swap(&a[i],&a[hi]);
int t = a[hi];
a[hi] = a[i];
a[i] = t;
return i;
}
void quicksort(int *a,int lo,int hi)
{
if(lo < hi)
{
int p = partition(a,lo,hi);
quicksort(a,lo,p);
quicksort(a,p+1,hi);
}
}
int main(void)
{
int a[10] = {3,4,6,7,5,8,9,2,1,0};
quicksort(a,0,9);
for(int i = 0;i < 10;i++)
printf("%d ",a[i]);
return 0;
}
好吧,您似乎在理解快速排序時犯了一個簡單的錯誤。
問題是您在調用partition()
時將樞軸元素放在數組內的正確位置。
我的意思是將數組中最初的元素視為
[ 3 , 4 , 6 , 7 , 5 , 8 , 9 , 2 , 1 , 4 ]
現在調用partition()
,數組應該如下所示(請注意,您選擇了最后一個元素作為樞軸元素,上面用粗體標記)
[ 3 , 2 , 1 , 4 , 5 , 8 , 9 , 4 , 6 , 7 ]
現在數組應該分為三部分
[ 3 , 2 , 1 ] [ 4 ] [ 5 , 8 , 9 , 4 , 6 , 7 ]
我們知道樞軸元素在正確的位置,所以不需要接觸中間部分,只需繼續剩下的左右部分。
您所做的僅被認為是partition()
之后的兩部分
[ 3 , 2 , 1 , 4 ] [ 5 , 8 , 9 , 4 , 6 , 7 ]
現在對於 [ 3 , 2 , 1 , 4 ] ,當您調用quicksort()
,它將陷入無限遞歸。
我修改了下面的部分,希望它有幫助
void quicksort(int *a,int lo,int hi)
{
if(lo < hi)
{
int p = partition(a,lo,hi);
quicksort(a,lo,p-1);
quicksort(a,p+1,hi);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.