当前位置: 首页 > 知识库问答 >
问题:

按升序排列数组的值

郑安晏
2023-03-14

我无法让它工作,我试图通过使用for循环按升序排列数组的值。

        int[] arr = new int[5] { 5, 6, 2, 4, 1 };

        for (int i = 0; i <= arr.Length; i++)
        {
            if (arr[i] > arr[i + 1])
            {
                int temp = arr[i + 1];
                arr[i] = arr[i + 1];
                arr[i] = temp;
            }

            Console.Write(arr[i]);
        }

共有3个答案

白光耀
2023-03-14

如果你想做你自己的排序,那么仅仅循环浏览一次项目并交换它们是不够的。与此最接近的是气泡排序算法,在该算法中,您可以反复遍历数组,直到没有更多的项可以交换:

int[] arr = new int[5] { 5, 6, 2, 4, 1 };

bool swapped = true;
while (swapped) {
  swapped = false;
  for (int i = 0; i < arr.Length - 1; i++) {
    if (arr[i] > arr[i + 1]) {
      swapped = true;
      int temp = arr[i + 1];
      arr[i] = arr[i + 1];
      arr[i] = temp;
   }
  }
}
for (int i = 0; i < arr.Length - 1; i++) {
  Console.Write(arr[i]);
}

还有一些内置的方法可以对数据进行排序,这些方法更易于使用,效率更高,并且已经过全面测试:

int[] arr = new int[5] { 5, 6, 2, 4, 1 };
Array.Sort(arr);
胡景澄
2023-03-14

int[]数组={11,33,5,-3,19,8,49};

        int temp;

        for (int i = 0; i < Array.Length - 1; i++)
        {

            for (int j = i + 1; j < Array.Length; j++)
            {
                if (Array[i] > Array[j])
                {

                    temp = Array[i];
                    Array[i] = Array[j];
                    Array[j] = temp;

                }

            }

        }

        Console.Write("Sorted:");

        foreach (int sort in Array)
            Console.Write("{0} ", sort);
陈开宇
2023-03-14

我假设您没有使用数组。排序,因为这是一个学习练习;没有其他方法可以避免这个非常常见的库函数。

您的算法不起作用的原因是,仅遍历一次数组并交换无序项是不够的。当数组几乎已排序,但第一个元素位于末尾时,尝试将此作为一个心理实验,如下所示:

2 3 4 5 6 7 1

一条路径会让您更接近,但它不会让您一直到达排序数组:

2 3 4 5 6 1 7

如您所见,必须多次重复此过程,直到对数组进行排序。如何知道数组已排序?您知道,当整个内部循环没有一次交换时。

以下是如何实现这一点:

bool didSwap;
do {
    didSwap = false;
    for (int i = 0; i < arr.Length-1; i++)
    {
        if (arr[i] > arr[i + 1])
        {
            int temp = arr[i + 1];
            arr[i + 1] = arr[i];
            arr[i] = temp;
            didSwap = true;
        }
    }
} while (didSwap);
for (int i = 0; i != arr.Length ; i++) {
    Console.Write(arr[i]);
}

注意代码中的几个更改:

  • 打印在单独循环中完成,排序完成后
  • 循环转到arr.length-1,而不是arr.length,因为否则您的最后一次检查将超出数组的边界。
  • 这种排序算法称为Bubble Sort。这个算法有各种优化,可以让它稍微快一点。
  • 一般来说,泡泡排序是较慢的排序算法之一。当要排序的项目数量较多时,您应该考虑高级算法,或者使用库实现。
 类似资料:
  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 有人能提供帮助,如何检查排序降序数组以及?干杯!

  • 这是第一个数组。 用户可以输入不超过100个整数,如果用户输入负数,将停止。 这是第二个数组。 用户可以输入不超过100个整数,如果用户输入负数将结束。 打印出第一个整数列表 rint出第二个整数列表 问题在于,它不会检查数组是否按升序排列。↓↓↓ 如果inOder=1,我需要合并这两个数组。

  • 问题内容: 我有一个关于如何按给定列对整个数组/ recarray排序的简单问题。例如,给定数组: 我想按第一列排序数据以返回: 问题答案: 使用,其中是要排序的列索引:

  • 我下面的代码不起作用,我也不知道为什么。 它编译得很好,但结果似乎没有排序。

  • 我试图建立一个方法,将排序一个二维数组的双打按列。基于所提供的规范,此方法也不应该采用长度不等的行的粗糙数组。我正在使用双[][]mdarray={{3.0, 4.0, 1.0, 8.0},{13.0, 2.0, 12.0, 9.0}测试这个 使用打印方法时,应将其显示为 3.0, 2.0, 1.0, 8.0, 13.0, 4.0, 12.0, 9.0, 使用单独的打印方法输出结果时,数组似乎没有

  • 问题如下: 由一个固定数量的n个端到端连接的段组成的列表,每个段已经按升序排列。 我考虑过使用mergesort,基本情况是,如果等于n,那么返回并合并它们,因为我们已经知道它们是排序的,但是如果我有3个段,它将不起作用,因为我除以2,你不能将3个段平均分成两部分。 另一种方法类似于合并排序。所以我对每个段使用n个堆栈,如果L[i],我们可以识别它 如果你有主意的话,伪代码会很好。 编辑: 一个例