📌  相关文章
📜  如何有效地对20年代的大列表日期进行排序

📅  最后修改于: 2021-04-26 06:03:00             🧑  作者: Mango

给定20年代的日期列表很大,如何有效地对列表进行排序。
例子:

Input:
       Date arr[] = {{20,  1, 2014},
                    {25,  3, 2010},
                    { 3, 12, 2000},
                    {18, 11, 2001},
                    {19,  4, 2015},
                    { 9,  7, 2005}}
Output:
      Date arr[] = {{ 3, 12, 2000},
                    {18, 11, 2001},
                    { 9,  7, 2005},
                    {25,  3, 2010},
                    {20,  1, 2014},
                    {19,  4, 2015}}

一个简单的解决方案是使用O(N log N)算法(例如“合并排序”)和自定义比较器。但是我们可以使用Radix Sort在O(n)时间对列表进行排序。在典型的Radix Sort实现中,我们首先按最后一位排序,然后再按最后一位排序,依此类推。强烈建议先通过基数排序来了解此方法。在此方法中,我们按以下顺序排序:

  • 首先使用计数排序按天排序
  • 然后使用计数排序按月排序
  • 最后,使用计数排序按年份排序

由于天数,月数和年数是固定的,所以所有这三个步骤都需要O(n)时间。因此,总时间复杂度为O(n)。

以下是上述想法的C++实现:

C++
// C++ program to sort an array
// of dates using Radix Sort
 
#include 
using namespace std;
 
// Utilitiy function to obtain
// maximum date or month or year
int getMax(int arr[][3],int n, int q)
{
    int maxi = INT_MIN;
    for(int i=0;i0){
        //to extract last digit  divide
        // by p then %10
        // Store count of occurrences in cnt[]
        int cnt[10]={0};
         
        for(int i=0;i=0;i--)
        {
            int lastDigit = (arr[i][q]/p)%10;
             
            // Build the output array
            for(int j=0;j<3;j++)
            {
                ans[cnt[lastDigit]-1][j]
                  =arr[i][j];   
            }
            cnt[lastDigit]--;
        }
        // Copy the output array to arr[],
        // so that arr[] now
        // contains sorted numbers
        // according to current digit
        for(int i=0;i


Java
// Java program to sort an array
// of dates using Radix Sort
import java.util.*;
class GFG{
 
// Utilitiy function to obtain
// maximum date or month or year
static int getMax(int arr[][], int n, int q)
{
    int maxi = Integer.MIN_VALUE;
    for(int i = 0; i < n; i++)
    {
        maxi = Math.max(maxi, arr[i][q]);
    }
    return maxi;
}
 
// A function to do counting sort of arr[]
// according to given q i.e.
// (0 for day, 1 for month, 2 for year)
static void sortDatesUtil(int arr[][],
                   int n, int q)
{
    int maxi = getMax(arr,n,q);
    int p = 1;
    while(maxi > 0)
    {
        // to extract last digit  divide
        // by p then %10
        // Store count of occurrences in cnt[]
        int []cnt = new int[10];
         
        for(int i = 0; i < n; i++)
        {
            cnt[(arr[i][q]/p) % 10]++;
        }
        for(int i = 1; i < 10; i++)
        {
            cnt[i] += cnt[i - 1];
        }
        int [][]ans = new int[n][3];
        for(int i = n - 1; i >= 0; i--)
        {
            int lastDigit = (arr[i][q]/p) % 10;
             
            // Build the output array
            for(int j = 0; j < 3; j++)
            {
                ans[cnt[lastDigit]-1][j]
                  =arr[i][j];   
            }
            cnt[lastDigit]--;
        }
       
        // Copy the output array to arr[],
        // so that arr[] now
        // contains sorted numbers
        // according to current digit
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                arr[i][j] = ans[i][j];
            }
        }
       
        // update p to get
        // the next digit
        p *= 10;
        maxi /= 10;
    }
}
 
// The main function that sorts
// array of dates
// using Radix Sort
static void sortDates(int dates[][], int n)
{
   
    // First sort by day
    sortDatesUtil(dates, n, 0);
   
    // Then by month
    sortDatesUtil(dates, n, 1);
    // Finally by year
    sortDatesUtil(dates, n, 2);
}
 
// A utility function to print an array
static void printArr(int arr[][], int n)
{
   for(int i = 0; i < 6; i++)
   {
        for(int j = 0; j < 3; j++)
        {
            System.out.print(arr[i][j] + " ");
        }
        System.out.println();
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int dates[][] = {{20,  1, 2014},
                    {25,  3, 2010},
                    { 3, 12, 2000},
                    {18, 11, 2000},
                    {19,  4, 2015},
                    { 9,  7, 2005}};
    int n = dates.length;
   
    // Function Call
    sortDates(dates,n);
    System.out.print("\nSorted Dates\n");
    printArr(dates,n);
}
}
 
// This code is contributed by Rajput-Ji


输出
Sorted Dates
18 11 2000 
3 12 2000 
9 7 2005 
25 3 2010 
20 1 2014 
19 4 2015