How to sort Integer digits in ascending order without Strings or Arrays?

前端 未结 8 694
傲寒
傲寒 2020-12-06 06:32

I\'m trying to sort the digits of an integer of any length in ascending order without using Strings, arrays or recursion.

Example:

Input: 451467
Outp         


        
相关标签:
8条回答
  • 2020-12-06 07:07

    Here is the simple solution :

        public class SortDigits
        {
            public static void main(String[] args)
            {
                sortDigits(3413657);
            }
    
            public static void sortDigits(int num)
            {
                System.out.println("Number  : " + num);
                String number = Integer.toString(num);
                int len = number.length(); // get length of the number
                int[] digits = new int[len];
                int i = 0;
                while (num != 0)
                {
                    int digit = num % 10;
                    digits[i++] = digit; // get all the digits
                    num = num / 10;
                }
                System.out.println("Digit before sorting: ");
                for (int j : digits)
                {
                    System.out.print(j + ",");
                }
                sort(digits);
                System.out.println("\nDigit After sorting: ");
                for (int j : digits)
                {
                    System.out.print(j + ",");
                }
            }
            //simple bubble sort 
            public static void sort(int[] arr)
            {
                for (int i = 0; i < arr.length - 1; i++)
                    for (int j = i + 1; j < arr.length; j++)
                    {
                        if (arr[i] > arr[j])
                        {
                            int tmp = arr[j];
                            arr[j] = arr[i];
                            arr[i] = tmp;
                        }
                    }
            }
        }
    
    0 讨论(0)
  • 2020-12-06 07:08

    My algorithm of doing it:

    int ascending(int a)
    {
        int b = a;
        int i = 1;
        int length = (int)Math.log10(a) + 1;   // getting the number of digits
        for (int j = 0; j < length - 1; j++)
        {
            b = a;
            i = 1;
            while (b > 9)
            { 
                int s = b % 10;                // getting the last digit
                int r = (b % 100) / 10;        // getting the second last digit
                if (s < r)
                {
                    a = a + s * i * 10 - s * i - r * i * 10 + r * i; // switching the digits
                }
                b = a;
                i = i * 10;
                b = b / i;                     // removing the last digit from the number
            }
        }
        return a;
    }
    
    0 讨论(0)
  • 2020-12-06 07:10

    There's actually a very simple algorithm, that uses only integers:

    int number = 4214173;
    int sorted = 0;
    int digits = 10;
    int sortedDigits = 1;
    boolean first = true;
    
    while (number > 0) {
        int digit = number % 10;
    
        if (!first) {
    
            int tmp = sorted;
            int toDivide = 1;
            for (int i = 0; i < sortedDigits; i++) {
                int tmpDigit = tmp % 10;
                if (digit >= tmpDigit) {
                    sorted = sorted/toDivide*toDivide*10 + digit*toDivide + sorted % toDivide;
                    break;
                } else if (i == sortedDigits-1) {
                    sorted = digit * digits + sorted;
                }
                tmp /= 10;
                toDivide *= 10;
            }
            digits *= 10;
            sortedDigits += 1;
        } else {
            sorted = digit;
        }
    
        first = false;
        number = number / 10;
    }
    System.out.println(sorted);
    

    it will print out 1123447. The idea is simple:

    1. you take the current digit of the number you want to sort(let's call it N)
    2. you go through all digits in already sorted number(let's call it S)
    3. if current digit in S is less than current digit in N, you just insert the digit in the current position in S. Otherwise, you just go to the next digit in S.

    That version of the algorithm can sort in both asc in desc orders, you just have to change the condition.

    Also, I suggest you to take a look at so-called Radix Sort, the solution here takes some ideas from radix sort, and I think the radix sort is the general case for that solution.

    0 讨论(0)
  • 2020-12-06 07:10

    It's 4 lines, based on a for loop variant of your while loop with a little java 8 spice:

    int number = 4214;
    
    List<Integer> numbers = new LinkedList<>(); // a LinkedList is not backed by an array
    for (int i = number; i > 0; i /= 10)
        numbers.add(i % 10);
    numbers.stream().sorted().forEach(System.out::println); // or for you forEach(IO::println)
    
    0 讨论(0)
  • 2020-12-06 07:15

    How to sort a number without use of array, string or sorting api? Well, you can sort a number with following simple steps (if too much to read then see the debugging output below to get an idea of how the sorting is done):

    1. Get the last digit of the number using (digit = number % 10)
    2. Divide number so last digit is gone (number /= 10)
    3. Loop through digits of number (that does not have digit) and check if digit is smallest
    4. If new smaller digit found then replace the digit = smallest digit and keep looking until end
    5. At the end of the loop you have found the smallest digit, store it (store = (store * 10) + digit
    6. Now that you know this is smallest digit, remove this digit from number and keep applying the above steps to remainder number and every time a smaller digit is found then add it to the store and remove digit from number (if digit is repeated in number, then remove them all and add them to store)

    I provided a code with two while loops in the main method and one function. The function does nothing but, builds a new integer excluding the digit that is passed to for example I pass the function 451567 and 1 and the function returns me 45567 (in any order, doesn't matter). If this function is passed 451567 and 5 then, it finds both 5 digits in number and add them to store and return number without 5 digits (this avoid extra processing).

    Debugging, to know how it sorts the integer:

    Last digit is : 7 of number : 451567
    Subchunk is 45156
    Subchunk is 4515
    Subchunk is 451
    Subchunk is 45
    Subchunk is 4
    Smalled digit in 451567 is 1
    Store is : 1
    Remove 1 from 451567
    Reduced number is : 76554
    Last digit is : 4 of number : 76554
    Subchunk is 7655
    Subchunk is 765
    Subchunk is 76
    Subchunk is 7
    Smalled digit in 76554 is 4
    Store is : 14
    Remove 4 from 76554
    Reduced number is : 5567
    Last digit is : 7 of number : 5567
    Subchunk is 556
    Subchunk is 55
    Subchunk is 5
    Smalled digit in 5567 is 5
    Store is : 145
    Remove 5 from 5567
    Repeated min digit 5 found. Store is : 145
    Repeated min digit 5 added to store. Updated store is : 1455

    Reduced number is : 76
    Last digit is : 6 of number : 76
    Subchunk is 7
    Smalled digit in 76 is 6
    Store is : 14556
    Remove 6 from 76
    Reduced number is : 7
    Last digit is : 7 of number : 7
    Smalled digit in 7 is 7
    Store is : 145567
    Remove 7 from 7
    Reduced number is : 0
    Ascending order of 451567 is 145567

    The sample code is as follow:

    //stores our sorted number
         static int store = 0; 
    
         public static void main(String []args){
            int number = 451567; 
            int original = number; 
    
            while (number > 0) {
                //digit by digit - get last most digit
                int digit = number % 10;
    
                System.out.println("Last digit is : " + digit + " of number : " + number); 
    
                //get the whole number minus the last most digit 
                int temp = number / 10; 
    
                //loop through number minus the last digit to compare
                while(temp > 0) {
                    System.out.println("Subchunk is " + temp); 
                    //get the last digit of this sub-number
                    int t = temp % 10; 
    
                    //compare and find the lowest
                    //for sorting descending change condition to t > digit
                    if(t < digit)   
                        digit = t; 
    
                    //divide the number and keep loop until the smallest is found
                    temp = temp / 10;
                }
                System.out.println("Smalled digit in " + number  + " is " + digit); 
    
                //add the smallest digit to store 
                store = (store * 10) + digit; 
    
                System.out.println("Store is : " + store); 
    
                //we found the smallest digit, we will remove that from number and find the 
                //next smallest digit and keep doing this until we find all the smallest 
                //digit in sub chunks of number, and keep adding the smallest digits to 
                //store
                number = getReducedNumber(number, digit); 
            }
            System.out.println("Ascending order of " + original + " is " + store); 
         }
    
    
         /*
         * A simple method that constructs a new number, excluding the digit that was found
         * to b e smallest and added to the store. The new number gets returned so that 
         * smallest digit in the returned new number be found.
         */
         public static int getReducedNumber(int number, int digit) {
            System.out.println("Remove " + digit + " from " + number); 
            int newNumber = 0; 
    
            //flag to make sure we do not exclude repeated digits, in case there is 44
            boolean repeatFlag = false; 
            while(number > 0) {
                int t = number % 10; 
                //assume in loop one we found 1 as smallest, then we will not add one to the new number at all
                if(t != digit) {
                    newNumber = (newNumber * 10) + t; 
                } else if(t == digit) {
                    if(repeatFlag) {
                        System.out.println("Repeated min digit " + t + "found. Store is : " + store);
                        store = (store * 10) + t; 
                        System.out.println("Repeated min digit " + t + "added to store. Updated store is : " + store);
                        //we found another value that is equal to digit, add it straight to store, it is 
                        //guaranteed to be minimum
                    } else {
                        //skip the digit because its added to the store, in main method, set flag so 
                        // if there is repeated digit then this method add them directly to store
                        repeatFlag = true; 
                    }
                }
                number /= 10; 
            }
            System.out.println("Reduced number is : " + newNumber); 
            return newNumber; 
         }
    }
    
    0 讨论(0)
  • 2020-12-06 07:17

    Since the possible elements (i. e. digits) in a number are known (0 to 9) and few (10 in total), you can do this:

    1. Print a 0 for every 0 in the number.
    2. Print a 1 for every 1 in the number.
        int number = 451467;
    
        // the possible elements are known, 0 to 9
        for (int i = 0; i <= 9; i++) {
            int tempNumber = number;
    
            while (tempNumber > 0) {
                int digit = tempNumber % 10;
                if (digit == i) {
                    IO.print(digit);
                }
                tempNumber = tempNumber / 10;
            }
        }
    
    0 讨论(0)
提交回复
热议问题