01/10/2018, 12:34

Giúp mình tìm lỗi bài toán sắp xếp dùng Quicksort này với

Mình đang làm 1 bài tập sắp xếp dãy đơn giản, gồm có 3 phần: Sắp xếp theo thứ tự tăng dần, thứ tự giảm dần và thứ tự tăng dần trị tuyệt đối. 2 phần đầu thì không có vấn đề gì nhưng ở phần 3 mình có dùng con trỏ và bị lỗi mà không hiểu vì sao, mong mọi người chỉ ra lỗi giúp mình với, mình xin cảm ơn nhiều.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SWAP(type, a, b) {type temp = a; a = b; b = temp;}
#define FOR(i, a, b) for (i = a; i < b; ++i)
void QuickSort(float *, int, int);
void QuickSort2(float **, int, int);

int main(void)
{
    float arr[10];
    float* arr_t[10];
    float arr2[10][2];
    int n, i;
    do {
        printf("n = ");
        scanf("%d", &n);
    } while (n <= 0 || n > 10);
    for (i = 0; i < n; ++i) {
        printf("arr[%d] = ", i);
        scanf("%f", arr + i);
    }
    QuickSort(arr, 0, n-1);
    printf("
Output:
");
    printf("
Tang dan:
");
    FOR(i, 0, n)
        printf("%.2f
", arr[i]);
    printf("
Giam dan:
");
    FOR(i, 0, n / 2)
        SWAP(float, arr[i], arr[n - 1 - i])
    FOR(i, 0, n)
        printf("%.2f
", arr[i]);
    printf("
Giam dan theo gia tri tuyet doi:
");
    FOR(i, 0, n) {
        **(arr2 + i) = arr[i];
        if (arr[i] < 0)
            *(*(arr2 + i) + 1) = - arr[i];
        else
            *(*(arr2 + i) + 1) = arr[i];
    }
    FOR(i, 0, n)
        arr_t[i] = *(arr2 + i) + 1;
    QuickSort2(arr_t, 0, n);
    FOR(i, 0, n)
        printf("%.2f
", *(arr_t[i] - 1));
}

void QuickSort(float *arr, int l, int r)
{
    int i, j;
    float temp, key;
    srand(time(NULL));
    key = arr[l + rand() % (r - l + 1)];
    i = l;
    j = r;
    while (i <= j) {
        while (arr[i] < key)
            ++i;
        while (arr[j] > key)
            --j;
        if (i <= j) {
            if (i < j)
                SWAP(float, arr[i], arr[j])
            ++i;
            --j;
        }
    }
    if (l < j) QuickSort(arr, l, j);
    if (i < r) QuickSort(arr, i, r);
}

void QuickSort2(float **arr, int l, int r)
{
    int i, j;
    float key;
    srand(time(NULL));
    key = **(arr + l + rand() % (r - l + 1));
    i = l;
    j = r;
    while (i <= j) {
        while (**(arr + i) < key)
            ++i;
        while (**(arr + j) > key)
            --j;
        if (i <= j) {
            if (i < j)
                SWAP(float*, arr[i], arr[j])
            ++i;
            --j;
        }
    }
    if (l < j) QuickSort2(arr, l, j);
    if (i < r) QuickSort2(arr, i, r);
}
Bài liên quan
0