如何有效地对20年代的大型日期列表进行排序

考虑到20年代的一大串日期,如何有效地对这些日期进行排序。

null

例子:

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 logn)算法,如 合并排序 还有一个自定义比较器。但是我们可以使用 基数排序 .典型的 基数排序 实现时,我们首先按最后一位数字排序,然后按最后第二位数字排序,依此类推。强烈建议首先通过基数排序来了解此方法。在这种方法中,我们按照以下顺序进行排序:

  • 第一次使用计数排序逐日排序
  • 然后使用计数排序按月排序
  • 最后,使用计数排序按年份排序

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

下面是C++实现上述思想:

C++

// C++ program to sort an array
// of dates using Radix Sort
#include <bits/stdc++.h>
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;i<n;i++){
maxi = 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)
void sortDatesUtil( int arr[][3],
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[10]={0};
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[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
void sortDates( int dates[][3], 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
void printArr( int arr[][3], int n)
{
for ( int i=0;i<6;i++)
{
for ( int j=0;j<3;j++)
{
cout<<arr[i][j]<< " " ;
}
cout<<endl;
}
}
// Driver Code
int main()
{
int dates[][3] = {{20,  1, 2014},
{25,  3, 2010},
{ 3, 12, 2000},
{18, 11, 2000},
{19,  4, 2015},
{ 9,  7, 2005}};
int n = sizeof (dates)/ sizeof (dates[0]);
// Function Call
sortDates(dates,n);
cout<< "Sorted Dates" ;
printArr(dates,n);
return 0;
}


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( "Sorted Dates" );
printArr(dates,n);
}
}
// This code is contributed by Rajput-Ji


Python3

# Python program to sort an array
# of dates using Radix Sort
import sys
# Utilitiy function to obtain
# maximum date or month or year
def getMax(arr, n, q):
maxi = sys.maxsize;
for i in range (n):
maxi = 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)
def sortDatesUtil(arr, n, q):
maxi = getMax(arr, n, q);
p = 1 ;
while (maxi > 0 ):
# to extract last digit divide
# by p then %10
# Store count of occurrences in cnt
cnt = [ 0 for i in range ( 10 )];
for i in range (n):
cnt[(arr[i][q] / / p) % 10 ] + = 1 ;
for i in range ( 1 , 10 ):
cnt[i] + = cnt[i - 1 ];
ans = [[ 0 for i in range ( 3 )] for j in range (n)];
for i in range (n - 1 , - 1 , - 1 ):
lastDigit = (arr[i][q] / / p) % 10 ;
# Build the output array
for j in range ( 3 ):
ans[cnt[lastDigit] - 1 ][j] = arr[i][j];
cnt[lastDigit] - = 1 ;
# Copy the output array to arr,
# so that arr now
# contains sorted numbers
# according to current digit
for i in range (n):
for j in range ( 3 ):
arr[i][j] = ans[i][j];
# update p to get
# the next digit
p * = 10 ;
maxi = maxi / / 10 ;
# The main function that sorts
# array of dates
# using Radix Sort
def sortDates(dates, 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
def printArr(arr, n):
for i in range ( 6 ):
for j in range ( 3 ):
print (arr[i][j], end = " " );
print ();
# Driver Code
if __name__ = = '__main__' :
dates = [[ 20 , 1 , 2014 ],[ 25 , 3 , 2010 ],[ 3 , 12 , 2000 ],[ 18 , 11 , 2000 ],[ 19 , 4 , 2015 ],
[ 9 , 7 , 2005 ]] ;
n = len (dates);
# Function Call
sortDates(dates, n);
print ( "Sorted Dates" );
printArr(dates, n);
# This code is contributed by gauravrajput1


C#

// C# program to sort an array
// of dates using Radix Sort
using System;
public class GFG
{
// Utilitiy function to obtain
// maximum date or month or year
static int getMax( int [,]arr, int n, int q)
{
int maxi = int .MinValue;
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++)
{
Console.Write(arr[i, j] + " " );
}
Console.WriteLine();
}
}
// 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.GetLength(0);
// Function Call
sortDates(dates,n);
Console.Write( "Sorted Dates" );
printArr(dates,n);
}
}
// This code is contributed by aashish1995.


Javascript

<script>
// javascript program to sort an array
// of dates using Radix Sort
// Utilitiy function to obtain
// maximum date or month or year
function getMax(arr , n , q) {
var maxi = Number.MIN_VALUE;
for ( var 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)
function sortDatesUtil(arr , n , q)
{
var maxi = getMax(arr, n, q);
var p = 1;
while (maxi > 0)
{
// to extract last digit divide
// by p then %10
// Store count of occurrences in cnt
var cnt = Array(10).fill(0);
for ( var i = 0; i < n; i++) {
cnt[parseInt((arr[i][q] / p)) % 10]++;
}
for ( var i = 1; i < 10; i++) {
cnt[i] += cnt[i - 1];
}
var ans = Array(n).fill().map(()=>Array(3).fill(0));
for ( var i = n - 1; i >= 0; i--) {
var lastDigit = parseInt((arr[i][q] / p) % 10);
// Build the output array
for ( var 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 ( var i = 0; i < n; i++) {
for ( var j = 0; j < 3; j++) {
arr[i][j] = ans[i][j];
}
}
// update p to get
// the next digit
p *= 10;
maxi = parseInt(maxi/10);
}
}
// The main function that sorts
// array of dates
// using Radix Sort
function sortDates(dates , 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
function printArr(arr , n) {
for ( var i = 0; i < 6; i++) {
for ( var j = 0; j < 3; j++) {
document.write(arr[i][j] + " " );
}
document.write( "<br/>" );
}
}
// Driver Code
var dates = [ [ 20, 1, 2014 ],
[ 25, 3, 2010 ],
[ 3, 12, 2000 ],
[ 18, 11, 2000 ],
[ 19, 4, 2015 ],
[ 9, 7, 2005 ] ];
var n = dates.length;
// Function Call
sortDates(dates, n);
document.write( "Sorted Dates" );
printArr(dates, n);
// This code is contributed by gauravrajput1
</script>


输出

Sorted Dates18 11 2000 3 12 2000 9 7 2005 25 3 2010 20 1 2014 19 4 2015 

本文由 tpriyanshu 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享