我用python实现了一个计数排序算法。我看到计数排序是稳定的,因为它保留了元素在原始数组中的顺序。你认为下面的实现是稳定的吗?
def countingsort(A,n):
C = [0]*n
B = [0]*n
# the value of A[i] becomes the index for counting
# C now stores the no. of occurences of element A[i] in A
for i in A:
C[i] = C[i] + 1
我问这个问题是因为我很感兴趣,我想知道如何知道一个算法是否稳定。
稳定是什么意思?如果两个键相等的对象在排序输出中以相同的顺序出现,则排序算法是稳定的,就像它们出现在要排序的输入数组中一样。
如果我正确理解了算法,数组中的等量元素就不能分配给同一个数组,所以它是一个稳定的算法。
我怎么能让这个不稳定?我不想做很大的改变,那么将for i = n down to 1 do更改为for i = 1 to n do怎么样?我认为这应该是打破它的一种方式,但我不太确定。
Input: Array arr with n integers, from 1 to m
Output: Array arr so
在c++语言中,为了获得O(n+m)的最佳时间复杂度,将两个未排序的数组排序到一个排序的数组中。我们如何修改这段代码,使其时间复杂度为O(m+n)?两个数组的大小应该不同。这里的时间复杂度为O((m+n)log(m+n))。如何使其复杂度达到O(m+n)?
#include <bits/stdc++.h>
using namespace std;
// Function to merge array in sorted order
void sortedMerge(int a[], int b[], int res[],
为了更好地理解算法,我正在尝试编写我自己版本的基排序。问题是,在第一个内部for循环(“j”)中,我得到了VS中的C6385错误。我不知道如何改写这一行,以使它发挥作用。我在这里做错什么了?
警告是:
警告C6385:从“countQueues”读取无效数据:可读的大小为'400‘字节,但可能读取'4000’字节。
void radixSort(int arr[], int arraySize)
{
int countDigits = GetMax(arr, arraySize); //max number of digits
queue<int&g
假设我写了一个非常棒的接口。事实上,我想要一些我用来实现它们的内置类型,这样我写的任何使用这个接口的代码也可以使用内置类型。
public interface IKickAss
{
int Yeahhhhhhh() { get; }
}
public static class Woot
{
public int Bar(IKickAss a, IKickAss b)
{
return a.Yeahhhhhhh - b.Yeahhhhhhh;
}
}
// What I'd like to do, sort of.
public par
我正在阅读基数、计数和存储桶排序的定义,它们似乎都只是下面的代码:
public static void sort(int[] a, int maxVal){
int [] bucket=new int[maxVal+1];
for (int i=0; i<bucket.length; i++){
bucket[i]=0;
}
for (int i=0; i<a.length; i++){
bucket[a[i]]++;
}
int outPos=0;
for (int i=0; i<
我必须以两种方式对汽车牌照(ABC 123)进行基数排序: 1)数组2)链表。最有趣的是排序必须在文件中完成。例如,从现在开始,我们将只讨论数组。我生成车号并将其放入数组中,然后使用二进制写入将所有生成的汽车车牌写入该文件。之后,我将新生成的文件交给Radix Sort,他需要进行魔术操作。我将展示我目前的代码,但它实际上不是‘真正的’基数排序,因为我的大脑无法理解如何在文件中实现基数排序。(我已经实现了普通数组和链表的基数排序,但是当它在一个文件中完成时,它是令人兴奋的)。我只是想问你们是否有任何关于我如何改进排序算法的提示或想法,因为它非常慢。谢谢。
PROGRAM.CS
public s
嗨,我正在尝试理解Radix排序的逻辑,我指的是维基百科的代码。这是接收数组的排序的排序函数,以及元素的数量。虽然代码运行得很好,但我不能理解代码的逻辑。在while循环中,我们首先初始化一个10位数的存储桶数组,该数组的第一个和第二个索引的计数分别为1和2。但在那之后,很难理解它试图做什么。
static void sort(int a[],int n)
{
int i=0;
int m =a[0];
int b[]=new int[n];
int exp=1;
for (i = 0; i < n; i++)
{
if (a[i] >
好的,我必须为无符号整数和浮点数创建一个基数排序。我的无符号整数版本可以正常工作,但我在处理浮点值时遇到了一些问题。基本上,它按照浮点数的整数值对数组的值进行排序,但不会基于小数值对其进行排序。(例如36.65234将出现在36.02311之前,如果它出现在未排序的数组中)这段代码是我进行位操作和掩码的地方,我非常确定这就是我的问题所在。
/* For loop to create bin */
for(int i=0; i<n; i++){
temp_int = (((unsigned int)(list[i]))>>bitwise)&0xff;
b
我试图用O(1)空间实现一个稳定的基排序。我看过Wikipedia,我注意到C实现使用一个临时变量来保存每次传递的排序值,而“就地”MSD基排序实现的部分非常混乱。
我使用了C代码,并尝试在C++中实现它,以获得稳定的本地基排序版本:
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
void radix_sort(vector<int>& v) {
//search for maximum number
int
使用JAVA,我尝试按基数排序对整数(升序)进行排序和数组,但似乎解决不了这个错误。
public class Ex_radix {
public static void radixSort(int[] A) {
int d = 0;
for (int digit = 0; digit < A.length; digit++) {// Checks what is the
// maximum amount of
我正在使用这个作为参考,看看算法是如何实现的。除本部分外,我大部分理解:
/*
* update all the buckets. If bucket[8] has 2,
* then there are 2 elements present till bucket 8
*/
for (i = 1; i < 10; i++)
bucket[i] = bucket[i] + bucket[i-1];
我不明白作者在那个循环中做了什么。有人能解释一下发生了什么事吗?
是的,我正在用纸和笔来观察到底发生了什么。我只是想澄清一下
你有一个数组和一个目标。查找数组中两个元素的差异。这种差异应该离目标最近。
(即,查找i, j,使(array[i]- array[j])最接近目标)
尝试:I使用order_map (C++哈希表)存储数组的每个元素。这将是O(n)。然后,我将有序元素输出到一个新的数组中(这个数组是排序增加的)。
接下来,我使用两个指针。
int mini = INT_MAX, a, b;
for (int i=0, j = ordered_array.size() -1 ; i <j;) {
int tmp = ordered_array[i] - ordered_array[j];