给定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