C# 单链表C中的计数排序#
有没有办法在单链表中进行计数排序?我没有看到任何例子,没有它们很难做到。我在数组中有一个例子,我想在单链表中做。 有人在单链表中做过吗C# 单链表C中的计数排序#,c#,sorting,singly-linked-list,counting-sort,C#,Sorting,Singly Linked List,Counting Sort,有没有办法在单链表中进行计数排序?我没有看到任何例子,没有它们很难做到。我在数组中有一个例子,我想在单链表中做。 有人在单链表中做过吗 public static int[] CountingSortArray(int[] array) { int[] aux = new int[array.Length]; // find the smallest and the largest value int min = array[0]
public static int[] CountingSortArray(int[] array)
{
int[] aux = new int[array.Length];
// find the smallest and the largest value
int min = array[0];
int max = array[0];
for (int i = 1; i < array.Length; i++)
{
if (array[i] < min) min = array[i];
else if (array[i] > max) max = array[i];
}
int[] counts = new int[max - min + 1];
for (int i = 0; i < array.Length; i++)
{
counts[array[i] - min]++;
}
counts[0]--;
for (int i = 1; i < counts.Length; i++)
{
counts[i] = counts[i] + counts[i - 1];
}
for (int i = array.Length - 1; i >= 0; i--)
{
aux[counts[array[i] - min]--] = array[i];
}
return aux;
}
公共静态int[]countingsortary(int[]数组)
{
int[]aux=新的int[array.Length];
//找到最小值和最大值
int min=数组[0];
int max=数组[0];
for(int i=1;imax)max=array[i];
}
int[]计数=新的int[max-min+1];
for(int i=0;i=0;i--)
{
aux[counts[array[i]-min]-]=array[i];
}
返回aux;
}
我在以下位置找到了一个在阵列上工作的:
我认为,只要付出最小的努力,就可以将其更改为链表,唯一的问题是,由于您没有随机访问权限,因此最终会多次遍历链表,例如,[]
,这使得它效率相当低。因为你似乎发现了我在打字之前做的同样的事情,我觉得我的答案有点毫无意义。然而,我还是有点好奇你哪里有问题
如果问题出在哪里,这里有一个提示:每次看到使用的array[i]
时,您都需要首先遍历链接列表,而不是首先获取第i项
编辑:您需要创建第二个频率链接列表的唯一原因是您需要实际处理生成的链接列表。如果你只是需要一个链表中的值的排序列表来显示,那么一个包含频率的数组就可以工作了(我想你可以同时创建一个包含所有值的数组,然后进行你已经有的计数排序)。如果我在路上的某个地方混淆了C、C++、C++、cx(我现在没有编译器),我会道歉,但是这应该给你一个好主意。p>
public static node* FindMin(node* root){ //FindMax would be nearly identical
node* minValue = root;
while(node->Next){
if(node->Value < minValue->Value)
minValue = node;
}
return minValue;
}
public static node* CountingSortArray(node* linklist){
node* root = linkedlist
node* min = FindMin(linklist);
node* max = FindMax(linklist);
int[] counts = new int[max->Value - min->Value + 1];
while(root != NULL){
counts[root->Value] += 1;
root = root->Next;
}
int i = 0;
root = linkedlist;
while(ptr != NULL){
if(counts[i] == 0)
++i;
else{
root->Value = i;
--count[i];
root = root->Next;
}
}
}
void push(node** head, int new_data){
node* newNode = new node();
newNode->Value = new_data;
newNode->Next = (*head);
(*head) = newNode;
}
void printList(node* root){
while(root != NULL){
printf(%d ", root->Value);
root = root->Next;
}
printf("\n");
}
int main(void){
node* myLinkedList = NULL;
push(&head, 0);
push(&head, 1);
push(&head, 0);
push(&head, 2);
push(&head, 0);
push(&head, 2);
printList(myLinkedList);
CountingSortArray(myLinkedList);
printList(myLinkedList);
}
publicstaticnode*FindMin(node*root){//FindMax几乎相同
node*minValue=root;
while(节点->下一步){
如果(节点->值<最小值->值)
最小值=节点;
}
返回最小值;
}
公共静态节点*计数端口数组(节点*链接列表){
node*root=linkedlist
节点*min=FindMin(链接列表);
节点*max=FindMax(链接列表);
int[]计数=新的int[max->Value-min->Value+1];
while(root!=NULL){
计数[根->值]+=1;
根=根->下一步;
}
int i=0;
root=链接列表;
while(ptr!=NULL){
如果(计数[i]==0)
++一,;
否则{
根->值=i;
--计数[一];
根=根->下一步;
}
}
}
无效推送(节点**头部,int new_数据){
node*newNode=newNode();
新建节点->值=新建数据;
新建节点->下一步=(*头);
(*头)=新节点;
}
无效打印列表(节点*根){
while(root!=NULL){
printf(%d),根->值;
根=根->下一步;
}
printf(“\n”);
}
内部主(空){
节点*myLinkedList=NULL;
推送(&头,0);
推送(和头部,1);
推送(&头,0);
推压(和头部,2);
推送(&头,0);
推压(和头部,2);
打印列表(myLinkedList);
CountingSortArray(myLinkedList);
打印列表(myLinkedList);
}
示例代码更像是带基数(max-min+1)的基数排序。通常计数排序类似于下面的代码。传递列表以获得min和max。再次传递以生成计数。传递计数以基于计数生成新数组(而不是复制数据)。示例代码片段:
for (size_t i = 0; i < array.Length; i++)
counts[array[i]-min]++;
size_t i = 0;
for(size_t j = 0; j < counts.Length); j++){
for(size_t n = counts[j]; n; n--){
aux[i++] = j+min;
}
}
for(size\u t i=0;i
请提供一个您正在寻找的示例。我在思考是否应该创建一个新的LinkedList来存储频率列表以及如何在LinkedList中查找最小值和最大值时遇到了问题,因为这是计数排序的基础。我相信您可能知道,链表中的每个节点都有一个“值”和一个指向网元的指针xt节点。因此,实现代码中的“查找最小值和最大值”部分不会太难。使用的循环必须更改。我可能会创建一个min和max函数,该函数取一个节点*并遍历整个链表一次,以查找最小值或最大值。您不需要新的链表来存储频率,实际上可以使用这里是数组,因为你知道频率中的第二项与linkedlist中的第二项相对应。几分钟后我会为你写一些代码。@Oilka在某个地方,我刚刚决定对当前的链接列表进行排序,你给出了排序算法,而不是创建一个新的或只是返回数组中的排序值。希望是有帮助的(我也希望代码能工作lol)!