🌓 天气与日历 切换到窄版

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 85|回复: 0

[其它教程] 堆排序,分别用汇编语言,C语言,C++,java,python编写出来

[复制链接]

2972

主题

4

回帖

3039

积分

管理员

积分
3039
发表于 2024-2-27 12:55:32 | 显示全部楼层 |阅读模式
堆排序,就是利用大顶堆或者小顶堆来设计的排序算法,是一种选择排序。堆是一种完全二叉树:
  • 大顶堆:每个节点的数值都大于或者等于其左右孩子节点的数值。
  • 小顶堆:每个节点的数值都小于或者等于其左右孩子节点的数值。



堆排序,分别用汇编语言,C语言,C++,java,python编写出来
以下是使用汇编语言、C语言、C++、Java和Python编写的堆排序算法示例代码:
1.汇编语言(x86)代码示例:

  1. assembly
  2. section .data
  3.     arr db 5, 3, 1, 2, 4
  4.     n equ $-arr
  5. section .text
  6.     global _start
  7. _start:
  8.     mov esi, n / 2 - 1 ; 构建初始堆
  9.     jmp heapify_loop
  10. heapify_loop:
  11.     call heapify
  12.     dec esi
  13.     cmp esi, 0
  14.     jge heapify_loop
  15.     mov esi, n - 1 ; 执行堆排序
  16.     jmp sort_loop
  17. sort_loop:
  18.     mov al, [arr]
  19.     xchg al, [arr + esi]
  20.     xchg al, [arr]
  21.     dec esi
  22.     cmp esi, 0
  23.     jge sort_loop
  24.     jmp exit
  25. heapify:
  26.     push esi
  27.     push ecx
  28.     push eax
  29.     mov ecx, esi
  30.     shl ecx, 1
  31.     inc ecx
  32.     cmp ecx, n
  33.     jge skip_left_child
  34.     mov al, [arr + ecx]
  35.     cmp al, [arr + esi]
  36.     jle skip_left_child
  37.     mov esi, ecx
  38. skip_left_child:
  39.     mov ecx, esi
  40.     inc ecx
  41.     cmp ecx, n
  42.     jge skip_right_child
  43.     mov al, [arr + ecx]
  44.     cmp al, [arr + esi]
  45.     jle skip_right_child
  46.     mov esi, ecx
  47. skip_right_child:
  48.     cmp esi, ecx
  49.     je skip_swap
  50.     mov al, [arr + esi]
  51.     xchg al, [arr + ecx]
  52.     xchg al, [arr + esi]
  53.     call heapify
  54. skip_swap:
  55.    
复制代码
pop eax
    pop ecx
    pop esi
    ret
exit:
    mov eax, 1 ; 退出系统调用
    xor ebx, ebx ; 返回值为0
    int 0x80 ; 调用系统调用




2.C语言代码示例:

  1. #include <stdio.h>
  2. void heapify(int arr[], int n, int i) {
  3.     int largest = i;
  4.     int left = 2 * i + 1;
  5.     int right = 2 * i + 2;
  6.     if (left < n && arr[left] > arr[largest]) {
  7.         largest = left;
  8.     }
  9.     if (right < n && arr[right] > arr[largest]) {
  10.         largest = right;
  11.     }
  12.     if (largest != i) {
  13.         int temp = arr[i];
  14.         arr[i] = arr[largest];
  15.         arr[largest] = temp;
  16.         heapify(arr, n, largest);
  17.     }
  18. }
  19. void heapSort(int arr[], int n) {
  20.     for (int i = n / 2 - 1; i >= 0; i--) {
  21.         heapify(arr, n, i);
  22.     }
  23.     for (int i = n - 1; i >= 0; i--) {
  24.         int temp = arr[0];
  25.         arr[0] = arr[i];
  26.         arr[i] = temp;
  27.         heapify(arr, i, 0);
  28.     }
  29. }

复制代码
int main() {
    int arr[] = {5, 3, 1, 2, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    heapSort(arr, n);
    printf("Sorted array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr);
    }
    printf("\n");
    return 0;
}




3.C++代码示例:


  1. #include <iostream>
  2. using namespace std;
  3. void heapify(int arr[], int n, int i) {
  4.     int largest = i;
  5.     int left = 2 * i + 1;
  6.     int right = 2 * i + 2;
  7.     if (left < n && arr[left] > arr[largest]) {
  8.         largest = left;
  9.     }
  10.     if (right < n && arr[right] > arr[largest]) {
  11.         largest = right;
  12.     }
  13.     if (largest != i) {
  14.         swap(arr[i], arr[largest]);
  15.         heapify(arr, n, largest);
  16.     }
  17. }
  18. void heapSort(int arr[], int n) {
  19.     for (int i = n / 2 - 1; i >= 0; i--) {
  20.         heapify(arr, n, i);
  21.     }
  22.     for (int i = n - 1; i >= 0; i--) {
  23.         swap(arr[0], arr[i]);
  24.         heapify(arr, i, 0);
  25.     }
  26. }

复制代码
int main() {
    int arr[] = {5, 3, 1, 2, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    heapSort(arr, n);
    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr << " ";
    }
    cout << endl;
    return 0;
}




4.Java代码示例:


  1. public class HeapSort {
  2.     public static void heapify(int arr[], int n, int i) {
  3.         int largest = i;
  4.         int left = 2 * i + 1;
  5.         int right = 2 * i + 2;
  6.         if (left < n && arr[left] > arr[largest]) {
  7.             largest = left;
  8.         }
  9.         if (right < n && arr[right] > arr[largest]) {
  10.             largest = right;
  11.         }
  12.         if (largest != i) {
  13.             int temp = arr[i];
  14.             arr[i] = arr[largest];
  15.             arr[largest] = temp;
  16.             heapify(arr, n, largest);
  17.         }
  18.     }
  19.     public static void heapSort(int arr[]) {
  20.         int n = arr.length;
  21.         for (int i = n / 2 - 1; i >= 0; i--) {
  22.             heapify(arr, n, i);
  23.         }
  24.         for (int i = n - 1; i >= 0; i--) {
  25.             int temp = arr[0];
  26.             arr[0] = arr[i];
  27.             arr[i] = temp;
  28.             heapify(arr, i, 0);
  29.         }
  30.     }
  31.    
  32. }
复制代码
public static void main(String args[]) {
        int arr[] = {5, 3, 1, 2, 4};
        heapSort(arr);
        System.out.print("Sorted array: ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr + " ");
        }
        System.out.println();
    }




5.Python代码示例:


  1. def heapify(arr, n, i):
  2.     largest = i
  3.     left = 2 * i + 1
  4.     right = 2 * i + 2
  5.     if left < n and arr[left] > arr[largest]:
  6.         largest = left
  7.     if right < n and arr[right] > arr[largest]:
  8.         largest = right
  9.     if largest != i:
  10.         arr[i], arr[largest] = arr[largest], arr[i]
  11.         heapify(arr, n, largest)
  12. def heapSort(arr):
  13.     n = len(arr)
  14.     for i in range(n // 2 - 1, -1, -1):
  15.         heapify(arr, n, i)
  16.     for i in range(n - 1, 0, -1):
  17.         arr[0], arr[i] = arr[i], arr[0]
  18.         heapify(arr, i, 0)

复制代码
arr = [5, 3, 1, 2, 4]
heapSort(arr)
print("Sorted array:", arr)




这些示例代码演示了如何使用汇编语言、C语言、C++、Java和Python编写堆排序算法。请根据您的需求和偏好选择适合您的语言。


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
快速回复 返回顶部 返回列表