簡體   English   中英

我的快捷排序分區功能

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

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