如何不使用数组对数字进行排序?

时间:2019-04-03 22:20:18

标签: java algorithm bubble-sort

如何找到不使用任何数组就可以使用给定数字的数字(例如485735)形成的最大和最小数字?

我当时正在研究冒泡排序(使用数组)算法,试图弄清楚如何在不使用数组的情况下编写算法,但是我的问题是要计算每个数字的索引

我唯一想到的是一种计算输入数字位数的算法(朋友帮助我完成了这项工作),但到目前为止,我已经尝试了4天 这是我的作业成绩的一个问题

规则是最小的数字不能以零开头 例如:

Input: 3134059 
The largest number is: 9543310
The smallest number is: 1033459

2 个答案:

答案 0 :(得分:2)

TL; DR:请参见IDEONE的以下逻辑演示。

假设数字是一个数字数组,例如名为d[],并假设索引0是最右边的数字。

冒泡排序会将较高的值移到较高的索引,因此,如果我们保持这种逻辑,则对d进行排序将得到所需的largestNumber,例如1357924成为9754321

假设您有一种方法pow10(n)计算出10 n ,则可以在任何索引处获取数字:

d[i] = number / pow10(i) % 10

示例:

         6 4 2 0  index
         ↓ ↓ ↓ ↓
number = 1357924

d[4] = 1357924 / pow10(4) % 10
     = 1357924 / 10000 % 10
     = 135 % 10
     =   5

在冒泡排序中,如果下标索引的元素较大,则交换相邻的元素,因此首先我们需要两个值。假设我们正在为i = 3做这件事:

         6 4 2 0  index
         ↓ ↓ ↓ ↓
number = 1357924
i = 3

a = d[i] = d[3] = 7
b = d[i+1] = d[4] = 5

a > b起,我们需要交换值。我们可以这样做,如下:

 1357924
-   7000   Clear digit at i=3
-  50000   Clear digit at i=4
=1300924   Value with digits cleared
+  70000   Set digit at i=4
+   5000   Set digit at i=3
=1375924   Value with digits at index 3 and 4 swapped

其公式为:

number = number - a * pow10(i) - b * pow10(i+1)
                + a * pow10(i+1) + b * pow10(i)

可以重构为:

number += ((a - b) * 10 - (a - b)) * pow10(i)

现在您知道如何使用上述公式来获取“数组元素值”(又名d[i])以及如何“交换数组元素”,并将其写入普通的bubbleort算法中,这样您就可以:

largestNumber = sortDigits(number)

您现在已经计算出最大值。要计算最小值,您只需简单地反转数字,但在这样做之前,您需要确保d[0] != 0

n = largestNumber, i = 0
while (n % 10 == 0) { // locate least non-zero digit
    n /= 10
    i++
}
if (i != 0) {
    // clear least digit and add at index 0
    n = n / 10 * pow10(i + 1) + n % 10
}

示例:

n = 97500
After loop: n = 975, i = 2
n / 10 = 97
            * pow10(i + 1) = 97000
                                   + n % 10 = 97005

现在您可以计算所需的其他值:

smallestNumber = reverse(n)

例如参见Java reverse an int value without using array了解具体操作方法。

答案 1 :(得分:0)

public static void main(String[] args) {

    StringBuilder s = new StringBuilder("4857035");
    char aux;

    for (int i = 0; i < s.length() - 1; i++) {
        for (int j = i + 1; j < s.length(); j++) {
            if (s.charAt(i) > (s.charAt(j))) {
                aux = s.charAt(i);
                s.setCharAt(i, s.charAt(j));
                s.setCharAt(j, aux);
            }
        }
    }
    //output 0345578

    while (s.charAt(0) == '0') {
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) != '0') {
                aux = s.charAt(0);
                s.setCharAt(0, s.charAt(i));
                s.setCharAt(i, aux);
                break;
            }
        }
    }
    //output 3045578
}

这是用于最小的数字,对于最大的数字,请更改if语句(if (s.charAt(i) < (s.charAt(j))上的符号,并删除while语句。