简单快速排序程序中的分段错误
Segementation fault in a simple Quicksort program
当我尝试执行以下代码时,它导致了分段错误。使用在线 GDB,程序会在第一次调用分区函数后停止工作。该程序从不进行递归,并在调用 partition()
后立即停止工作。
#include <stdio.h>
int partition(int arr[], int len)
{
int pivot = len / 2;
int left = 0;
int right = len - 1;
int temp;
while (right != 0 || left !=0)
{
if (right != pivot)
{
if (arr[right] < arr[pivot])
{
temp = arr[right];
arr[right] = arr[pivot];
arr[pivot] = temp;
pivot = right;
}
else right--;
}
else
{
if (arr[left] > arr[pivot])
{
temp = arr[left];
arr[left] = arr[pivot];
arr[pivot] = temp;
pivot = left;
}
else left++;
}
}
return pivot;
}
void quicksort(int arr[], int len)
{
if (len > 1)
{
int pivot = partition(arr, len);
quicksort(arr, pivot);
quicksort(arr+pivot+1, len-pivot-1);
}
}
int main()
{
int arr[] = {1,6,3,2,9,5,4,7,8};
quicksort(arr, 9);
for (int i =0; i< 9; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
由于某些原因调用分区函数时,变量 pivot、left、right 都用垃圾值初始化。
请帮忙。
您的主要 while
条件 (right != 0 || left !=0)
存在缺陷。它所需要的只是 一个 lower-bound 通过 else left++'
碰撞并且该条件将是 perma-true,最终导致段破坏。
相反,你想左右崩溃,直到他们达成共识。例如:while (right > left)
当我尝试执行以下代码时,它导致了分段错误。使用在线 GDB,程序会在第一次调用分区函数后停止工作。该程序从不进行递归,并在调用 partition()
后立即停止工作。
#include <stdio.h>
int partition(int arr[], int len)
{
int pivot = len / 2;
int left = 0;
int right = len - 1;
int temp;
while (right != 0 || left !=0)
{
if (right != pivot)
{
if (arr[right] < arr[pivot])
{
temp = arr[right];
arr[right] = arr[pivot];
arr[pivot] = temp;
pivot = right;
}
else right--;
}
else
{
if (arr[left] > arr[pivot])
{
temp = arr[left];
arr[left] = arr[pivot];
arr[pivot] = temp;
pivot = left;
}
else left++;
}
}
return pivot;
}
void quicksort(int arr[], int len)
{
if (len > 1)
{
int pivot = partition(arr, len);
quicksort(arr, pivot);
quicksort(arr+pivot+1, len-pivot-1);
}
}
int main()
{
int arr[] = {1,6,3,2,9,5,4,7,8};
quicksort(arr, 9);
for (int i =0; i< 9; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
由于某些原因调用分区函数时,变量 pivot、left、right 都用垃圾值初始化。
请帮忙。
您的主要 while
条件 (right != 0 || left !=0)
存在缺陷。它所需要的只是 一个 lower-bound 通过 else left++'
碰撞并且该条件将是 perma-true,最终导致段破坏。
相反,你想左右崩溃,直到他们达成共识。例如:while (right > left)