排序算法——堆排序

概述

从头实现堆排序。
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。如果要从大到小排序,则应该使用大根堆,即根节点的值最大。时间复度为 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)).


步骤

  • 建堆(最大堆),常采用向上调整建堆
  • 将堆第一个元素与已排好数据前一位交换,进行下沉操作调整堆,同时乱序数据量减少一个
  • 直到所有数据排序完成

可以看出,堆排序也是选择排序的一种,通过大小根堆的性质一步步挑选出最值,然后完成排序。用堆取最值的时间复杂度为 O ( l o g n ) O(logn) O(logn),所用元素都遍历一遍为 O ( n ) O(n) O(n),总时间复杂度为 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))


示例代码

public class HeapSort {
    public static void main(String[] args) {
        int[] arr = {57, 65, 54, 30, 45, 7, 6, 26, 35, 96};
        int[] arr_new = heapSort(arr);
        for (int i : arr_new) {
            System.out.println(i);
        }
    }

    public static int[] heapSort(int[] a) {
        int[] arr = builtHeap(a);
        int index = arr.length - 1;
        while (index > 0) {
            swap(arr, index);
            index--;
        }
        return arr;

    }

    public static int[] builtHeap(int[] arr) {
        int len = arr.length;
        int[] temp = new int[len];
        for (int i = 0; i < len; i++) {
            temp[i] = arr[i];
            swim(temp, i);
        }
        return temp;
    }

    public static void swim(int[] arr, int index) {
        if (index == 0) {
            return;
        }
        while (arr[index] > arr[(index - 1) / 2]) {
            int t = arr[index];
            arr[index] = arr[(index - 1) / 2];
            arr[(index - 1) / 2] = t;
            index = (index - 1) / 2;
        }
    }

    public static void swap(int[] arr, int index) {
        int t = arr[0];
        arr[0] = arr[index];
        arr[index] = t;
        sink(arr, index);
    }

    public static void sink(int[] arr, int index) {
        int i1 = 0;
        int i2 = 0;
        while ((2 * i1 + 1) < index) {
            i2 = 2 * i1 + 1;
            if ((2 * i1 + 2) < index) {
                if (arr[2 * i1 + 1] > arr[2 * i1 + 2]) {
                    i2 = 2 * i1 + 1;
                } else {
                    i2 = 2 * i1 + 2;
                }
            }
            if (arr[i1] < arr[i2]) {
                int t = arr[i1];
                arr[i1] = arr[i2];
                arr[i2] = t;
                i1 = i2;
            } else {
                break;
            }
        }
    }


}
[out]:
6
7
26
30
35
45
54
57
65
96

def heapSort(arr):
    arr = builtHeap(arr)
    index = len(arr) - 1
    while index > 0:
        swap(arr, index)
        index -= 1

    return arr


def sink(arr, index):  # 结束于index-1
    i1 = 0
    while (2 * i1 + 1) < index:
        i2 = 2 * i1 + 1
        if 2 * i1 + 2 < index:
            if arr[2 * i1 + 1] > arr[2 * i1 + 2]:
                i2 = 2 * i1 + 1
            else:
                i2 = 2 * i1 + 2
        if arr[i1] < arr[i2]:
            arr[i1], arr[i2] = arr[i2], arr[i1]
            i1 = i2
        else:
            break


def swim(arr, index):
    while arr[index] > arr[max((index - 1) // 2, 0)]:
        arr[index], arr[(index - 1) // 2] = arr[(index - 1) // 2], arr[index]
        index = (index - 1) // 2


def swap(arr, index):
    arr[0], arr[index] = arr[index], arr[0]
    sink(arr, index)


def builtHeap(arr):
    length = len(arr)
    temp = [0] * length
    for i in range(len(arr)):
        temp[i] = arr[i]
        swim(temp, i)

    return temp


if __name__ == '__main__':
    a = [59, 56, 97, 19, 40, 48, 13, 75, 51, 65]
    out = heapSort(a)
    print(out)

[out]:
[13, 19, 40, 48, 51, 56, 59, 65, 75, 97]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,你可以使用内置的 `sorted` 函数来对列表进行排序。例如: ```python numbers = [3, 4, 2, 1] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用列表的 `sort` 方法来对列表进行排序。与 `sorted` 函数不同的是,`sort` 方法是在原地对列表进行排序,也就是说不会返回一个新的列表,而是直接修改原来的列表。例如: ```python numbers = [3, 4, 2, 1] numbers.sort() print(numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用 Python 的 heapq 库中的堆排序算法堆排序一种速度较快的排序算法,特别适用于海量数据的排序。例如: ```python import heapq numbers = [3, 4, 2, 1] heapq.heapify(numbers) # 将列表转化为 sorted_numbers = [] while numbers: sorted_numbers.append(heapq.heappop(numbers)) # 将中最小的数取出并放到结果列表中 print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 此外,Python 还提供了许多其他的排序算法,例如快速排序、归并排序等。你可以使用 Python 的 timeit 库来对不同的排序算法进行测试,以找出最快的排序算法。 ### 回答2: 数据结构是计算机科学中非常重要的一个概念,它是一种组织和存储数据的方式。而实现排序算法数据结构中的一个重要应用。 在Python中,可以使用多种数据结构来实现排序算法,比如列表、数组和等。下面我将介绍一种常用的排序算法——插入排序的Python实现。 插入排序一种简单且常用的排序算法,它的基本思想是将待排序的元素一个一个地按照大小插入到已经排好序的列表中。具体步骤如下: 1. 创建一个新的空列表,作为存放已排序元素的容器。 2. 遍历待排序的列表,依次取出每个元素。 3. 将取出的元素与已排序元素的最后一个元素比较,如果取出的元素较小,则将它插入到已排序元素的末尾;如果取出的元素较大,则向前比较,找到合适的位置插入。 4. 重复步骤3,直到待排序列表中的所有元素都被取出并插入到已排序列表中。 5. 返回已排序的列表,即为排序结果。 下面是插入排序的Python实现代码: ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 通过调用`insertion_sort`函数,传入待排序的列表,即可得到排序结果。 这就是数据结构一种常用排序算法——插入排序的Python实现。当然,除了插入排序,还有许多其他排序算法也可以使用Python来实现,比如冒泡排序、快速排序等。每种排序算法都有其特点和适用场景,可以根据具体需求选择合适的排序算法来使用。 ### 回答3: 数据结构是计算机存储、组织和管理数据的方式。在Python中,可以使用不同的数据结构来实现排序算法。 常见的排序算法有冒泡排序、插入排序选择排序、快速排序堆排序和归并排序等。 冒泡排序一种比较简单的排序算法,它重复地交换相邻的元素,直到整个序列有序为止。可以使用列表作为数据结构来实现冒泡排序。 插入排序一种较为直观的排序算法,它将未排序的元素逐个插入到已排序的部分中,构建有序序列。也可以使用列表实现插入排序选择排序一种简单直观的排序算法,它每次选择排序部分的最小元素,并将其与未排序部分的最左边元素交换位置。同样可以使用列表来实现选择排序。 快速排序一种常用的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列。同样可以使用列表作为数据结构来实现快速排序堆排序一种利用数据结构来进行排序算法,它通过不断地构建和调整来达到排序的目的。可以使用列表来实现堆排序。 归并排序一种稳定的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列,然后将两个有序子序列合并为一个有序序列。同样可以使用列表来实现归并排序。 总的来说,Python提供了多种数据结构算法来实现排序操作,根据实际需求和性能要求选择适合的算法数据结构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值