刘欢(C#) 2023-06-07 15:15 采纳率: 0%
浏览 13

利用随机数方法实现从小到大的堆排序(注:不得使用泛型集合)

static void Main(string[] args)
{
int[] array = GenerateRandomArray(10); // 生成随机数组
Console.WriteLine("原始数组:");
PrintArray(array);

    HeapSortAlgorithm(array); // 堆排序

    Console.WriteLine("排序后的数组:");
    PrintArray(array);
}

// 生成随机数组
static int[] GenerateRandomArray(int size)
{
    Random random = new Random();
    int[] array = new int[size];
    for (int i = 0; i < size; i++)
    {
        array[i] = random.Next(100); // 生成0到100之间的随机数
    }
    return array;
}

// 打印数组
static void PrintArray(int[] array)
{
    foreach (int num in array)
    {
        Console.Write(num + " ");
    }
    Console.WriteLine();
}

// 堆排序算法
static void HeapSortAlgorithm(int[] array)
{
    int n = array.Length;

    // 构建最大堆
    for (int i = n / 2 - 1; i >= 0; i--)
    {
        Heapify(array, n, i);
    }

    // 从堆中提取元素,逐个放置到数组末尾,并重新构建堆
    for (int i = n - 1; i > 0; i--)
    {
        // 将当前根节点(最大值)与数组末尾元素交换
        int temp = array[0];
        array[0] = array[i];
        array[i] = temp;

        // 重新构建堆,只需考虑根节点
        Heapify(array, i, 0);
    }
}

// 通过调整节点使其符合最大堆的性质
static void Heapify(int[] array, int n, int rootIndex)
{
    int largest = rootIndex; // 假设根节点最大
    int leftChild = 2 * rootIndex + 1;
    int rightChild = 2 * rootIndex + 2;

    // 比较根节点与左子节点
    if (leftChild < n && array[leftChild] > array[largest])
    {
        largest = leftChild;
    }

    // 比较根节点与右子节点
    if (rightChild < n && array[rightChild] > array[largest])
    {
        largest = rightChild;
    }

    // 如果根节点不是最大值,则交换根节点和最大节点
    if (largest != rootIndex)
    {
        int temp = array[rootIndex];
        array[rootIndex] = array[largest];
        array[largest] = temp;

        // 递归调整交换后的子树
        Heapify(array, n, largest);
    }
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-11 16:22
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7623125
    • 这篇博客也不错, 你可以看下用递归的方法实现字符串的逆序(不调用库函数)
    • 除此之外, 这篇博客: 【数据结构与算法】之深入解析“最优运动员比拼回合”的求解思路与算法示例中的 ② 随机化模拟 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
      • 为每一个运动员随机生成一个战斗力(保证 firstPlayer 和 secondPlayer 为最大和次大),当两个运动员进行比拼时战斗力较高的获胜。
      • 不断模拟,统计 firstPlayer 和 secondPlayer 相遇的轮次的最大值和最小值即可。
      • 如果是看所有用例的总用时,那么需要根据 n 的大小来设置模拟次数。
      • C++ 示例:
      struct node {
          int a , b;
          bool operator <(const node &p) {
              return b < p.b;
          }
      }player[30];
      
      class Solution {
      public:
          vector<int> earliestAndLatest(int n, int firstPlayer, int secondPlayer) {
              srand(time(NULL));
      
              // 根据n的大小设置模拟次数
              int N;
              if(n <= 10)
                  N = 800;
              else if (n <= 20)
                  N = 8000;
              else N = 38000;
      
              int ans1 = 9999 , ans2 = 0 , rest , now;
              
              while(N--)
              {
                  // 剩余的运动员
                  rest = n;
      
                  // 初始化战斗力
                  for(int i = 1 ; i <= n ; i++)
                  {
                      player[i].a = rand() % 1075943;
                      player[i].b = i;
                  }
                  player[firstPlayer].a = 11000000;
                  player[secondPlayer].a = 10999999;
                  
                  // 统计轮次
                  now = 1;
               
                  // 模拟比赛
                  while(rest > 1)
                  {
                      for(int i = 1 ; i <= rest / 2 ; i++)
                      {
                          if(player[i].a < player[rest + 1 - i].a)
                              player[i] = player[rest + 1 - i];
      
                          // 统计firstPlayer和secondPlayer相遇轮次的最大值和最小值
                          if(player[i].b == firstPlayer && player[rest + 1 - i].b == secondPlayer)
                              ans1 = min(ans1 , now) , ans2 = max(ans2 , now);
                      }
                      now++;
                      rest = (rest + 1) / 2;
                      sort(player + 1 , player + rest + 1);
                  }
              }
              
              vector<int> ans = {ans1 , ans2};
              return ans;
      
          }
      };
      
    • 您还可以看一下 吴刚老师的【吴刚大讲堂】电商视觉的排版与应用方法课程中的 基础页面功能布局优化方法小节, 巩固相关知识点

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 6月7日

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行