[英]My partition function for quicksort
我寫了這個lomuto類型的函數用於快速排序,但是沒有用。 運行時發生分段錯誤。 我的錯誤在哪里?
int partition(int *a, int low, int high)
{
int pos = low, i, pivot = a[low], temp;
for (i = low + 1; i <= high; i++)
if(a[i] <= pivot) {
pos++;
temp = a[pos];
a[pos] = a[i];
a[i] = temp;
}
return pos;
}
void quickS(int *a, int low, int high)
{
while (low < high) {
int pivot = partition(a, low, high);
quickS(a, low, pivot - 1);
low = pivot + 1;
}
}
嘗試這個:
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int data[], int l, int h)
{
int i;
int p;
int firsthigh;
p = h;
firsthigh = l;
for (i = l; i < h; ++i)
{
if (data[i] < data[p])
{
swap(&data[i], &data[firsthigh]);
firsthigh++;
}
}
swap(&data[p], &data[firsthigh]);
return firsthigh;
}
ivot(a [low])似乎需要交換。
驗證代碼:
#include<stdio.h>
int partition(int *a, int low, int high){
int pos = low, i, pivot = a[low], temp;
for (i = low + 1; i <= high; i++)
if(a[i] <= pivot) {
pos++;
temp = a[pos];
a[pos] = a[i];
a[i] = temp;
}
return pos;
}
int main(){
int data[] = { 10, 1, 2, 3 };
int i, retvalue;
retvalue = partition(data, 0, 4-1);
printf("%d\n", retvalue);
for(i = 0; i< 4; ++i)
printf("%d ", data[i]);//10 1 2 3 : N/C
printf("\n");
return 0;
}
可以認為,如果這樣的分區功能懷疑引起堆棧溢出,然后重復調用將無法正常工作。
這樣嘗試
int partition (int arr[], int low, int high )
{
int x = arr[high];
int i = (low - 1);
for (int j = l; j <= high- 1; j++)
{
if (arr[j] <= x)
{
i++;
swap (&arr[i], &arr[j]);
}
}
swap (&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int A[], int low, int high)
{
if (low < high)
{
int p = partition(A, low, high);
quickSort(A, low, p - 1);
quickSort(A, p + 1, high);
}
}
在獲得正確的樞軸位置之后,需要將樞軸放置在該位置,然后返回該位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.