堆排序比我更狡猾

发布于 2024-12-20 17:19:32 字数 1000 浏览 2 评论 0原文

我正在尝试实现基于数组的堆排序,它对前几个排序但不完全排序,我不明白为什么。这是我正在处理的内容:

public class HeapSort{

    static int[] numbers = new int[] { 0, 13, 8, 5, 10, 9, 15, 1, 2, 3, 6, 4, 12, 14, 7, 11 };
    static int[] array = new int[16];

    public static void main(String[] args) {

        for (int i = 0; i < 15; i++) {
            array[i] = numbers[i];
            if (i > 1)
                sort(i);
        }

        for (int i = 1; i < 15; i++) {
            System.out.println(array[i]);
        }

    }

    public static void sort(int i) {

        int parentLocation = i / 2;
        int childLocation = i;

        int parentValue = array[parentLocation];

        int childValue = array[childLocation];

            if (childValue < parentValue) {

                array[parentLocation] = childValue;
                array[childLocation] = parentValue;

                sort(parentLocation);

            }

    }

}

我确信我使用递归来回忆父级上的排序是错误的,但我不明白为什么?

TIA

I'm trying to implement a array based Heap Sort, its sorting the first few but not fully and I can't figure out why. Here is what I'm working with:

public class HeapSort{

    static int[] numbers = new int[] { 0, 13, 8, 5, 10, 9, 15, 1, 2, 3, 6, 4, 12, 14, 7, 11 };
    static int[] array = new int[16];

    public static void main(String[] args) {

        for (int i = 0; i < 15; i++) {
            array[i] = numbers[i];
            if (i > 1)
                sort(i);
        }

        for (int i = 1; i < 15; i++) {
            System.out.println(array[i]);
        }

    }

    public static void sort(int i) {

        int parentLocation = i / 2;
        int childLocation = i;

        int parentValue = array[parentLocation];

        int childValue = array[childLocation];

            if (childValue < parentValue) {

                array[parentLocation] = childValue;
                array[childLocation] = parentValue;

                sort(parentLocation);

            }

    }

}

I'm sure that its a fault in my use of recursion to recall the sort on the parent but I can't see why?

TIA

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉城凉梦凉人心 2024-12-27 17:19:32
This is heap_sort which uses heapify and max heap concepts. I coded as per the algorithm in "Intro to Algos" book. Have a look.

#include "stdafx.h"

#define LEFT(i)         (2 * (i))
#define RIGHT(i)        (((2 * (i)) + 1))
#define PARENT(i)       ((i) / 2))

void print_heap(int input[], int n)
{
    int i;
    printf("Printing heap: \n");
    for (i = 0; i < n; i++)
        printf("%d ", input[i]);
    printf("\n");
}

void swap_nodes(int *a, int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}


void max_heapify(int input[], int i, int n)
{
    int largest;
    int l = LEFT(i + 1) - 1; // Get 0 based array index
    int r = RIGHT(i + 1) - 1; // Get 0 based array index

    if (l < n && input[l] > input[i]) {
        largest = l;
    } else {
        largest = i;
    }

    if (r < n && input[r] > input[largest]) {
        largest = r;
    }

    if (largest != i) {
        swap_nodes(&input[i], &input[largest]);
        max_heapify(input, largest, n);
    }
}

void heapify(int input[], int n)
{
    for (int i = n/2; i >= 0; i--)
        max_heapify(input, i, n); 
}

void heap_sort(int input[], int n)
{
    heapify(input, n);

    for (int i = n - 1; i >= 1; i--) {
        swap_nodes(&input[0], &input[i]);
        n = n - 1;
        max_heapify(input, 0, n);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    //int input[] = {6, 5, 3, 1, 8, 7, 4, 2};
    //int input[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
    int input[] = {5, 3, 17, 10, 84, 19, 6, 22, 9, 1};
    //int input[] = {16, 14, 10, 8, 7, 9, 3, 2, 4, 1};


    int n = sizeof(input) / sizeof(input[0]);

    print_heap(input, n);
    heap_sort(input, n);
    print_heap(input, n);

    return 0;

}
This is heap_sort which uses heapify and max heap concepts. I coded as per the algorithm in "Intro to Algos" book. Have a look.

#include "stdafx.h"

#define LEFT(i)         (2 * (i))
#define RIGHT(i)        (((2 * (i)) + 1))
#define PARENT(i)       ((i) / 2))

void print_heap(int input[], int n)
{
    int i;
    printf("Printing heap: \n");
    for (i = 0; i < n; i++)
        printf("%d ", input[i]);
    printf("\n");
}

void swap_nodes(int *a, int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}


void max_heapify(int input[], int i, int n)
{
    int largest;
    int l = LEFT(i + 1) - 1; // Get 0 based array index
    int r = RIGHT(i + 1) - 1; // Get 0 based array index

    if (l < n && input[l] > input[i]) {
        largest = l;
    } else {
        largest = i;
    }

    if (r < n && input[r] > input[largest]) {
        largest = r;
    }

    if (largest != i) {
        swap_nodes(&input[i], &input[largest]);
        max_heapify(input, largest, n);
    }
}

void heapify(int input[], int n)
{
    for (int i = n/2; i >= 0; i--)
        max_heapify(input, i, n); 
}

void heap_sort(int input[], int n)
{
    heapify(input, n);

    for (int i = n - 1; i >= 1; i--) {
        swap_nodes(&input[0], &input[i]);
        n = n - 1;
        max_heapify(input, 0, n);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    //int input[] = {6, 5, 3, 1, 8, 7, 4, 2};
    //int input[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
    int input[] = {5, 3, 17, 10, 84, 19, 6, 22, 9, 1};
    //int input[] = {16, 14, 10, 8, 7, 9, 3, 2, 4, 1};


    int n = sizeof(input) / sizeof(input[0]);

    print_heap(input, n);
    heap_sort(input, n);
    print_heap(input, n);

    return 0;

}
枫林﹌晚霞¤ 2024-12-27 17:19:32

我在 C# 中有这个最小堆实现,漂亮易于阅读。你的 impl 缺失了很多。比如堆化。看看它。希望有帮助。

I have this min heap implementation in c#, pretty easy to read. Your impl is missing a lot. such as heapify. Take a look at it. hope it helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文