<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[mergesort mit listen. verbesserungsvorschläge?]]></title><description><![CDATA[<p>die meisten algorithmenbücher schweigen sich darüber aus wie man am besten mergesort mit verketten listen implementiert. also hab ich mich mal versucht und bin aber nicht so ganz zufrieden, da dass ganze doch recht lang geworden ist. hat jemand vorschläge unter beibehaltung der eigenschaften (nur O(log n) zusätzlicher speicher) das ganze kürzer oder vor allem eleganter zu schreiben.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct NodeStruct {
	int value;
	struct NodeStruct *next;
};

typedef struct NodeStruct Node;

struct ListStruct {
	int length;
	Node *head;
	Node *tail;
};

typedef struct ListStruct List;

void split(List *l, List *half1, List *half2)
{
	int i;
	Node *iter;

	iter = l-&gt;head;
	for (i = 0; i &lt; l-&gt;length / 2 - 1; ++i) {
		iter = iter-&gt;next;
	}
	half1-&gt;head = l-&gt;head;
	half1-&gt;tail = iter;
	half1-&gt;length = l-&gt;length / 2;
	half2-&gt;head = iter-&gt;next;
	half2-&gt;tail = l-&gt;tail;
	half2-&gt;length = l-&gt;length - half1-&gt;length;
	half1-&gt;tail-&gt;next = NULL;
}

void merge(List *list1, List *list2, List *result)
{
	Node *iter1;
	Node *iter2;

	iter1 = list1-&gt;head;
	iter2 = list2-&gt;head;

	if (iter1-&gt;value &lt;= iter2-&gt;value) {
		result-&gt;head = iter1;
		result-&gt;tail = iter1;
		iter1 = iter1-&gt;next;
	} else {
		result-&gt;head = iter2;
		result-&gt;tail = iter2;
		iter2 = iter2-&gt;next;
	}
	while (iter1 &amp;&amp; iter2) {
		if (iter1-&gt;value &lt;= iter2-&gt;value) {
			result-&gt;tail-&gt;next = iter1;
			result-&gt;tail = iter1;
			iter1 = iter1-&gt;next;
		} else {
			result-&gt;tail-&gt;next = iter2;
			result-&gt;tail = iter2;
			iter2 = iter2-&gt;next;
		}
	}
	if (iter1) {
		result-&gt;tail-&gt;next = iter1;
		result-&gt;tail = list1-&gt;tail;
	} else if (iter2) {
		result-&gt;tail-&gt;next = iter2;
		result-&gt;tail = list2-&gt;tail;
	}
	result-&gt;length = list1-&gt;length + list2-&gt;length;
}

void mergesort(List *l)
{
	List half1;
	List half2;

	if (l-&gt;length &lt;= 1)
		return;

	split(l, &amp;half1, &amp;half2);
	mergesort(&amp;half1);
	mergesort(&amp;half2);
	merge(&amp;half1, &amp;half2, l);
}
</code></pre>
<p>gruß danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255964/mergesort-mit-listen-verbesserungsvorschläge</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 00:19:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255964.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Dec 2009 12:29:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to mergesort mit listen. verbesserungsvorschläge? on Sun, 06 Dec 2009 12:29:54 GMT]]></title><description><![CDATA[<p>die meisten algorithmenbücher schweigen sich darüber aus wie man am besten mergesort mit verketten listen implementiert. also hab ich mich mal versucht und bin aber nicht so ganz zufrieden, da dass ganze doch recht lang geworden ist. hat jemand vorschläge unter beibehaltung der eigenschaften (nur O(log n) zusätzlicher speicher) das ganze kürzer oder vor allem eleganter zu schreiben.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct NodeStruct {
	int value;
	struct NodeStruct *next;
};

typedef struct NodeStruct Node;

struct ListStruct {
	int length;
	Node *head;
	Node *tail;
};

typedef struct ListStruct List;

void split(List *l, List *half1, List *half2)
{
	int i;
	Node *iter;

	iter = l-&gt;head;
	for (i = 0; i &lt; l-&gt;length / 2 - 1; ++i) {
		iter = iter-&gt;next;
	}
	half1-&gt;head = l-&gt;head;
	half1-&gt;tail = iter;
	half1-&gt;length = l-&gt;length / 2;
	half2-&gt;head = iter-&gt;next;
	half2-&gt;tail = l-&gt;tail;
	half2-&gt;length = l-&gt;length - half1-&gt;length;
	half1-&gt;tail-&gt;next = NULL;
}

void merge(List *list1, List *list2, List *result)
{
	Node *iter1;
	Node *iter2;

	iter1 = list1-&gt;head;
	iter2 = list2-&gt;head;

	if (iter1-&gt;value &lt;= iter2-&gt;value) {
		result-&gt;head = iter1;
		result-&gt;tail = iter1;
		iter1 = iter1-&gt;next;
	} else {
		result-&gt;head = iter2;
		result-&gt;tail = iter2;
		iter2 = iter2-&gt;next;
	}
	while (iter1 &amp;&amp; iter2) {
		if (iter1-&gt;value &lt;= iter2-&gt;value) {
			result-&gt;tail-&gt;next = iter1;
			result-&gt;tail = iter1;
			iter1 = iter1-&gt;next;
		} else {
			result-&gt;tail-&gt;next = iter2;
			result-&gt;tail = iter2;
			iter2 = iter2-&gt;next;
		}
	}
	if (iter1) {
		result-&gt;tail-&gt;next = iter1;
		result-&gt;tail = list1-&gt;tail;
	} else if (iter2) {
		result-&gt;tail-&gt;next = iter2;
		result-&gt;tail = list2-&gt;tail;
	}
	result-&gt;length = list1-&gt;length + list2-&gt;length;
}

void mergesort(List *l)
{
	List half1;
	List half2;

	if (l-&gt;length &lt;= 1)
		return;

	split(l, &amp;half1, &amp;half2);
	mergesort(&amp;half1);
	mergesort(&amp;half2);
	merge(&amp;half1, &amp;half2, l);
}
</code></pre>
<p>gruß danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818580</guid><dc:creator><![CDATA[merger]]></dc:creator><pubDate>Sun, 06 Dec 2009 12:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to mergesort mit listen. verbesserungsvorschläge? on Sun, 06 Dec 2009 12:32:04 GMT]]></title><description><![CDATA[<p>achja vor allem regt mich auch, dass ich length wissen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1818583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1818583</guid><dc:creator><![CDATA[merger]]></dc:creator><pubDate>Sun, 06 Dec 2009 12:32:04 GMT</pubDate></item></channel></rss>