我已经阅读了一些关于算法的旧书,并学习了不同类型的算法。看起来所有最快的排序算法都是在O(nLogn)时间内运行的,它让我思考为什么这是我们所能做的最好的?我编写了另一个算法,它在某些情况下运行得更好(除非我遗漏了什么),但在其他情况下却非常糟糕。这是一种正在使用的算法吗?我只是在这里重新发明方向盘?
public class Main {
public static void main(String[] args) {
// array sort looks like it performs best in this example.
// this is because
其思想是在最终数组中将所有值设置为其父索引,然后删除所有空值。下面是一些简单的实现:
int x[] = {9,3,4,2,1,12,5};
sortList(x)
public static int[] sortList(int[] x){
int[] y = new int[15];
for (int i=0; i < x.length; i++){
int value = x[i];
y[value] = value;
}
return removeNull(y);
}
public static int[] rem
我有一个包含一个循环的图,但是我需要使用“拓扑排序”(当然,实际的拓扑排序不处理循环)对它进行排序。我在想怎么做呢?
例如:
A -> B
B -> C
C -> D
D -> A
可能的解决办法是:
A -> B -> C -> D
B -> C -> D -> A
C -> D -> A -> B
D -> A -> B -> C
我看到了作为,但是它对我的用例来说太复杂了。
长话短说,我想出了这个算法,但我怀疑我是不是发明了什么。那么这个叫什么呢? 我知道它在多个领域有很多限制。例如,此实现不能对高于UInt16的数字进行排序,并且限制为最多出现int.MaxValue次。我也可能在某个地方遇到一些数组边界问题。它已经像吃蛋糕一样吃掉了RAM :) 实际算法是在CustomSort方法中实现的。其余的是我用来测试的代码。 class Program
{
static Random r = new Random((int)DateTime.Now.Ticks);
static int[] GetRandomIntege
如果有n个变量,每个变量都有m个可能的值。(对于整数,m是20亿左右。)
首先,按顺序将每个可能的值映射为从0到m-1的整数.并定义映射函数。
index(v): value to integer
value(i): integer to value
其次,循环n个变量并计算每个值出现的次数。
for v in variables {
counter[index(v)] += 1
}
最后,循环计数器数组并将值放入结果数组。
for i in 0...m-1 {
for j in 1...counter[i] {
result.append(value(i))
我已经按桶排序为数字数组创建了一个程序。为此,我按照bin sort方法创建了一个链表数组。
// Bucket or Bin sort
#include<iostream>
using namespace std;
//Bin sort has linear complexity( O(n))
// node class
class node
{
public:
int data;
node *next;
};
// print array function
void
print (int arr[], int n)
{
for (int i = 0; i &
如果有一组节点N和一组顶点V_1定义具有一定拓扑顺序的图G_1,那么如何检查来自N的节点子集和定义图G_2的新顶点V_2是否保持G_1的拓扑顺序?
例如:
G_1:
D -> E
B -> C
A -> C
G_1:[A, B, C, D, E]的拓扑序
G_2:
D -> B
B -> E
G_2:[D, B, E]的拓扑序
我在考虑某种蛮力方法,生成G_1的所有拓扑顺序,从这些命令中删除在G_2中找不到的节点,并检查是否有任何与G_2的第一个排序相匹配的方法。
我的潜在解决方案正确吗?你有更好的建议吗?
我在使用计数排序按字母顺序对名称进行排序时遇到了困难,例如,我应该按字母顺序排序,并将数字输入添加到其中,例如0001 Alex Smith, Gregory John, Alex Smith, Adam Richard, Alex Ryan。输出应按以下顺序进行:
亚当·理查德
亚历克斯·瑞安
亚历克斯·史密斯
格雷戈里·约翰
到目前为止我的代码是:
public class Names
{
//private static int[] c;
public ArrayList<String> getUserInput()
{
ArrayList<
基本上,我正在尝试用Java编写一个算法来确定数组中乱序的对的数量。所以如果我们取i和j,并且j在数组中的位置比i更高,但是Ai > Aj,那么它把这两个数算作反转。目前,我所拥有的是:
for(int i = 0; i<n-1; i++){
if (A[i] > A[i+1]){
k++;
我知道如何做这样的事情,但我希望运行时是(n+k),其中n是数组的长度,k是数组中的反转次数。
编辑:这是我实现插入排序的尝试:
int k = 0;
int [] A = {5, 4, 3, 2, 1};
int n = A.length;
for(int i
我在Python中为问题找到了一个解决方案,它使用“非比较排序算法来获取计数”。它对执行按位操作的代码进行2次递归调用。
def inv_count(a, m=(1 << 32)):
if not m or not a:
return 0
count = 0
ones, zeros = [], []
for n in a:
if n & m:
ones.append(n & ~m)
else:
count += len(ones)
我的程序应该运行一个循环,用随机值填充数组,然后使用选择排序、增强气泡排序和插入排序对数组进行排序。问题是,它每次都返回相同的比较计数。
为什么我的代码总是返回相同的比较计数?
import java.util.Random;
public class AssignmentIV {
public static void main(String[] args) {
int[] testRuns = new int[4]; //stores the values for the generation of random arrays
testRuns[0] = 1