如果数组(数字)的元素按排序顺序,升序或降序,如果它们没有按任何排序顺序排序,我编写一个返回true的方法时遇到问题。如果数组是升序但我不知道如何在同一方法中检查降序,我可以返回正确的布尔值。我目前有:
public static bool IsArraySorted(int[] numbers)
{
for (int i = 1; i < numbers.Length; i++)
{
if (numbers[i - 1] > numbers[i])
return false;
}
return true;
}
任何人都可以提供有关如何检查已排序的降序数组的帮助吗?干杯!
答案 0 :(得分:9)
应该是这样的:
public static bool IsArraySorted(int[] numbers)
{
bool? ascending = null;
for (int i = 1; i < numbers.Length; i++)
{
if (numbers[i - 1] != numbers[i])
{
bool ascending2 = numbers[i - 1] < numbers[i];
if (ascending == null)
{
ascending = ascending2;
}
else if (ascending.Value != ascending2)
{
return false;
}
}
}
return true;
}
请注意使用ascending
变量来保存数组的“方向”。它是在第一次找到两个不同的元素时初始化的。
请注意,如果需要,您甚至可以返回数组的“方向”:
public static bool IsArraySorted(int[] numbers, out bool isAscending)
{
isAscending = true;
bool? ascending = null;
并在if (ascending == null)
if (ascending == null)
{
ascending = ascending2;
isAscending = ascending2;
}
这是基于IEnumerable<TSource>
的通用版本:
public static bool IsSorted<TSource>(IEnumerable<TSource> source, out bool isAscending, Comparer<TSource> comparer = null)
{
isAscending = true;
if (comparer == null)
{
comparer = Comparer<TSource>.Default;
}
bool first = true;
TSource previous = default(TSource);
bool? ascending = null;
foreach (TSource current in source)
{
if (!first)
{
int cmp = comparer.Compare(previous, current);
if (cmp != 0)
{
bool ascending2 = cmp < 0;
if (ascending == null)
{
ascending = ascending2;
isAscending = ascending2;
}
else if (ascending.Value != ascending2)
{
return false;
}
}
}
first = false;
previous = current;
}
return true;
}
请注意使用bool first
/ TSource previous
来处理i - 1
(以及for
周期能够“跳过”第一个元素的事实)
答案 1 :(得分:3)
使用Linq -
public static bool IsArraySorted(int[] numbers)
{
var orderedAsc = numbers.OrderBy(a => a);
var orderedDes = numbers.OrderByDescending(a => a);
bool isSorted = numbers.SequenceEqual(orderedAsc) ||
numbers.SequenceEqual(orderedDes);
return isSorted;
}
答案 2 :(得分:2)
这使用一个循环来测试两种情况:
public static bool IsSorted<T>(IEnumerable<T> items, Comparer<T> comparer = null)
{
if (items == null) throw new ArgumentNullException("items");
if (!items.Skip(1).Any()) return true; // only one item
if (comparer == null) comparer = Comparer<T>.Default;
bool ascendingOrder = true; bool descendingOrder = true;
T last = items.First();
foreach (T current in items.Skip(1))
{
int diff = comparer.Compare(last, current);
if (diff > 0)
{
ascendingOrder = false;
}
if (diff < 0)
{
descendingOrder = false;
}
last = current;
if(!ascendingOrder && !descendingOrder) return false;
}
return (ascendingOrder || descendingOrder);
}
用法:
int[] ints = { 1, 2, 3, 4, 5, 6 };
bool isOrderedAsc = IsSorted(ints); // true
bool isOrderedDesc = IsSorted(ints.Reverse()); //true
如果您将其作为扩展方法,则可以将其用于任何类型:
bool ordered = new[]{"A", "B", "C"}.IsSorted();
答案 3 :(得分:1)
public static boolean checkSortedness(final int[] data)
{
for (int i = 1; i < data.length; i++)
{
if (data[i-1] > data[i]) {
return false;
}
}
return true;
}
答案 4 :(得分:1)
我的答案在哪里?我大约一小时前写的:
public enum SortType
{
unsorted = 0,
ascending = 1,
descending = 2
}
public static SortType IsArraySorted(int[] numbers)
{
bool ascSorted = true;
bool descSorted = true;
List<int> asc = new List<int>(numbers);
asc.Sort();
for (int i = 0; i < asc.Count; i++)
{
if (numbers[i] != asc[i]) ascSorted = false;
if (numbers[asc.Count - 1 - i] != asc[i]) descSorted = false;
}
return ascSorted ? SortType.ascending : (descSorted? SortType.descending : SortType.unsorted);
}
示例:
答案 5 :(得分:0)
它看起来更像是学术任务,而不是实际问题。我想偶尔回到基础知识并没有什么害处:
public static bool IsSortedAscOrDesc(int[] arr)
{
int last = arr.Length - 1;
if (last < 1) return true;
bool isSortedAsc = true;
bool isSortedDesc = true;
int i = 0;
while (i < last && (isSortedAsc || isSortedDesc))
{
isSortedAsc &= (arr[i] <= arr[i + 1]);
isSortedDesc &= (arr[i] >= arr[i + 1]);
i++;
}
return isSortedAsc || isSortedDesc;
}
答案 6 :(得分:0)
对具有2个(或更少)元素的数组进行排序,
{0,0}进行升序和降序排序,{0,1}升序,{1,0}降序,{1,1}升序排序&desc。
可以使用一个循环,但是分隔大小写似乎更快。
对于具有2个以上元素的数组,
如果第一个元素小于最后一个元素,
检查:a [i] <= a [i + 1]。
下面,我使用“ ai <=(ai = a [i])”,将ai的旧值与新值进行比较
ai的值,每个元素只能读取一次。
import numpy as np
import pandas as pd
mat = pd.Series([np.array([[1, 1],[2, 2],[3, 3]]), np.array([[5, 5],[6, 6],[7, 7]])])
# 0 [[1, 1], [2, 2], [3, 3]]
# 1 [[5, 5], [6, 6], [7, 7]]
# dtype: object
arr = np.array(mat.values)
print(arr.shape) # (2,), instead of (2,3,2)
简短版本。
using System;
class Program
{
static void Main()
{
int i = 512; int[] a = new int[i--]; while (i > 0) a[i] = i--; //a[511] = 1;
Console.WriteLine(isSorted0(a));
var w = System.Diagnostics.Stopwatch.StartNew();
for (i = 1000000; i > 0; i--) isSorted0(a);
Console.Write(w.ElapsedMilliseconds); Console.Read();
}
static bool isSorted0(int[] a) // 267 ms
{
if (a.Length < 3) return true; int j = a.Length - 1;
return a[0] < a[j] ? incr(a) : a[0] > a[j] ? decr(a) : same(a);
}
static bool incr(int[] a)
{
int ai = a[0], i = 1, j = a.Length;
while (i < j && ai <= (ai = a[i])) i++; return i == j;
}
static bool decr(int[] a)
{
int ai = a[0], i = 1, j = a.Length;
while (i < j && ai >= (ai = a[i])) i++; return i == j;
}
static bool same(int[] a)
{
int ai = a[0], i = 1, j = a.Length - 1;
while (i < j && ai == a[i]) i++; return i == j;
}
static bool isSorted1(int[] numbers) // 912 ms accepted answer
{
bool? ascending = null;
for (int i = 1; i < numbers.Length; i++)
if (numbers[i - 1] != numbers[i])
{
bool ascending2 = numbers[i - 1] < numbers[i];
if (ascending == null) ascending = ascending2;
else if (ascending.Value != ascending2) return false;
}
return true;
}
}