假设我有一个整数数组:
1 2 5 3 7 6
什么是足够简单的算法,以排序的方式确定这是数字的偶数还是奇数排列(即1 2 3 5 6 7
)?表演在这里并不十分重要;我宁愿有一个简单的代码。
答案 0 :(得分:3)
简单代码(假设n个数字存储在数组a中):
int f()
{
int cnt=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if (a[i]>a[j]) cnt++;
return cnt%2;
}
如果f()返回0,那么它甚至是置换并返回1,那么它是奇数。
答案 1 :(得分:1)
根据维基百科,符号由反转次数(无序元素对)决定。这给出了O(n ** 2)算法
答案 2 :(得分:1)
尝试实现您自己的Heap Sort Algorithm版本,其复杂度为O(n log n)并计算排列数量以构建您的签名(我假设您知道我在说什么)。
示例代码:
public static void HeapSort(int[] input)
{
//Build-Max-Heap
int heapSize = input.Length;
for (int p = (heapSize - 1) / 2; p >= 0; p--)
MaxHeapify(input, heapSize, p);
for (int i = input.Length - 1; i > 0; i--)
{
//Swap
int temp = input[i];
input[i] = input[0];
input[0] = temp;
heapSize--;
MaxHeapify(input, heapSize, 0);
}
}
private static void MaxHeapify(int[] input, int heapSize, int index)
{
int left = (index + 1) * 2 - 1;
int right = (index + 1) * 2;
int largest = 0;
if (left < heapSize && input[left] > input[index])
largest = left;
else
largest = index;
if (right < heapSize && input[right] > input[largest])
largest = right;
if (largest != index)
{
int temp = input[index];
input[index] = input[largest];
input[largest] = temp;
MaxHeapify(input, heapSize, largest);
}
}
答案 3 :(得分:1)
另一个在O(nlogn)中运行的简单代码,而tr []是一个最初都包含0的数组。
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=a[i];j;j-=j&-j) ans+=tr[j];
for(int j=a[i];j<=n;j+=j&-j) tr[j]++;
}
printf((n*(n-1)/2-ans)%2?"odd\n":"even");
答案 4 :(得分:0)
此向量的置换矩阵的行列式的符号应该给出答案。
答案 5 :(得分:0)
将排列分解为独立循环的乘积。奇数周期很奇怪。甚至周期都是均匀的。加起来。
答案 6 :(得分:0)
简单并在python中完成,因为我不可避免地需要再次找到它:
def is_even(p):
if len(p) == 1:
return True
trans = 0
for i in range(0,len(p)):
j = i + 1
for j in range(j, len(p)):
if p[i] > p[j]:
trans = trans + 1
return ((trans % 2) == 0)