假设我将以下数据集存储在链表中(不包括标题):
ID | Name
1 | John
2 | Albert
3 | Simon
现在,我想根据字母顺序对节点进行排序。
我想知道如何在不使用数组(以及像Lists,Vectors,ArrayLists等类似的东西)和不使用库排序方法(例如Collections.sort)的情况下提出自己的排序方法 即可。
换句话说,我想知道排序的概念以及如何以系统的方式安排节点。它不一定非常有效 - 它只需要工作。
我将在Java中尝试这一点,但我也会感谢伪代码或提示/提示/其他资源。
谢谢。
附录:
LinkedList.java
class LinkedList
{
private Node head; // first node in the linked list
private int count;
public int getCount()
{
return count;
}
public Node getHead()
{
return head;
}
public LinkedList()
{
head = null; // creates an empty linked list
count = 0;
}
public void deleteFromFront()
{
if (count > 0)
{
Node temp = head;
head = temp.getLink();
temp = null;
count--;
}
}
public void AddToFront(Object cd)
{
Node newNode = new Node(cd);
newNode.setLink(head);
head = newNode;
count++;
}
public void RemoveAtPosition(int n)
{
int counter=1;
Node previous=null;
if(n==1)
deleteFromFront();
else if(n<=getCount())
for(Node j=head;j!=null;j=j.getLink())
{
if(counter==n&&previous!=null)
{
previous.setLink(j.getLink());
j.setLink(null);
}
previous=j;
counter++;
}
else
System.out.println("Unable to remove object at position "+n);
}
public void AddAtPosition(int n, Object cd)
{
int counter=1;
Node newNode=new Node(cd);
Node previous=null;
for(Node j=head;j!=null;j=j.getLink())
{
if(counter==n&&previous!=null)
{
newNode.setLink(j.getLink());
j.setLink(newNode);
}
previous=j;
counter++;
}
}
public void Swap(int n1, int n2)
{
// how do I swap nodes?
}
public void Sort()
{
// how do I sort nodes?
}
}
Node.java
public class Node {
private Object data;
private Node link;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getLink() {
return link;
}
public void setLink(Node link) {
this.link = link;
}
public Node(Object data) {
this.data = data;
this.link = null;
}
}
答案 0 :(得分:2)
如果您想自己动手,在链接列表上插入排序非常简单。创建一个新的空链表,然后将旧元素中的所有元素插入其中。维基百科有一个C代码example。
答案 1 :(得分:1)
如果你想知道JDK是如何做到的......我将列表复制到一个数组中,对其进行排序并将其复制回来。
你可以对链表使用冒泡排序,但它会慢一些,所以没有意义,除非你喜欢疼痛。 ;)
答案 2 :(得分:1)
我意识到你说你不想使用Collections.sort,但只是为了确保:你确实意识到Collections.sort允许你自己实现排序顺序,对吧?如果没有,http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html(和许多其他资源)将提供相关信息。
否则,您可以实施许多排序算法。其中一个更容易理解的是Bubble Sort。 http://en.wikipedia.org/wiki/Bubble_sort包含对它的一个很好的解释,包括对不同排序步骤的一个很好的可视化。
但冒泡排序(完全没有)是一种有效的排序方式。还有许多其他排序算法(合并排序,插入排序,快速排序,...请参阅维基百科关于“排序算法”的文章以获得概述),它们各自都有其优点和缺点。这取决于您正在排序哪种算法最适合的数据。
答案 3 :(得分:0)
您可以将列表复制到数组中并对其进行排序。否则,可以使用各种排序算法,即合并排序,冒泡排序等。
您可以看到this用于合并排序实现。
答案 4 :(得分:0)
虽然不完全相同,但请查看外部排序(数据未加载到内存中;例如,您希望对大于RAM的文件进行排序)。它们通常通过在文件之间移动数据来工作,其方式类似于在链接列表之间移动节点的方式。