Datenstrukturen – Zählen und Rekursion sind keine Rekursionen

Fügen Sie hier eine Bildbeschreibung ein


Vorwort

Sagen Sie wichtige Dinge dreimal!
Studie! Studie! Studie!
Arbeite hart! Arbeite hart! Arbeite hart!


1. Nicht rekursive Implementierung der Zusammenführung

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Code:

void MergeSortNonR(int* a, int n)
{
    
    
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
    
    
		perror("malloc fail");
		return;
	}

	int gap = 1;
	while (gap < n)
	{
    
    
		for (int i = 0; i < n; i += 2 * gap)
		{
    
    
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;
			// [begin1,end1] [begin2,end2] 归并
			int index = i;
			while (begin1 <= end1 && begin2 <= end2)
			{
    
    
				if (a[begin1] < a[begin2])
				{
    
    
					tmp[index++] = a[begin1++];
				}
				else
				{
    
    
					tmp[index++] = a[begin2++];
				}
			}

			while (begin1 <= end1)
			{
    
    
				tmp[index++] = a[begin1++];
			}

			while (begin2 <= end2)
			{
    
    
				tmp[index++] = a[begin2++];
			}

			// 拷贝回原数组
			memcpy(a + i, tmp + i, (2 * gap) * sizeof(int));
		}
		gap *= 2;
	}

	free(tmp);
}

2. Zählsortierung

Idee:
Zählsortierung, auch bekannt als Pigeonhole-Prinzip, ist eine deformierte Anwendung der Hash-Direktadressierungsmethode.

Fügen Sie hier eine Bildbeschreibung ein

Code:

void CountSort(int* a, int n)
{
    
    
	int min = a[0], max = a[0];
	for (size_t i = 0; i < n; i++)
	{
    
    
		if (a[i] < min)
			min = a[i];

		if (a[i] > max)
			max = a[i];
	}

	int range = max - min + 1;
	int* count = (int*)malloc(sizeof(int) * range);
	
	if (count == NULL)
	{
    
    
		perror("malloc fail");
		return;
	}
	memset(count, 0, sizeof(int) * range);

	// 统计数据出现次数
	for (int i = 0; i < n; i++)
	{
    
    
		count[a[i] - min]++;
	}

	// 排序
	int j = 0;
	for (int i = 0; i < range; i++)
	{
    
    
		while (count[i]--)
		{
    
    
			a[j++] = i + min;
		}
	}
}

Zusammenfassung der Funktionen der Zählsortierung:

  1. Die Zählsortierung ist sehr effizient, wenn der Datenbereich konzentriert ist, ihr anwendbarer Umfang und ihre Szenarien sind jedoch begrenzt.
  2. Zeitkomplexität: O(MAX(N,range))
  3. Raumkomplexität: O(Bereich)
  4. Stabilität: stabil

3. Analyse der Komplexität und Stabilität des Ordinalalgorithmus

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein


Zusammenfassen

Sagen Sie wichtige Dinge dreimal!
Erfolg! Erfolg! Erfolg!
Aufleuchten! Von nun an~

Supongo que te gusta

Origin blog.csdn.net/mdjsmg/article/details/133498857
Recomendado
Clasificación