Binäre Suche in C-Sprache

Inhaltsverzeichnis

1. Binärer Suchalgorithmus

Zweitens die kleinen Punkte, auf die bei der Verzweigungsanweisung geachtet werden sollte


 

1. Binärer Suchalgorithmus

Die sogenannte binäre Suche soll herausfinden, ob eine gegebene Zahl in dieser Folge in einer Menge geordneter Folgen enthalten ist.

Es gibt drei Hauptschritte:

1. Ermitteln Sie die linken und rechten Indizes links
und rechts des zu durchsuchenden Bereichs. 2. Bestimmen Sie den Index Mitte des mittleren Elements gemäß links und rechts.
3. Bestimmen Sie den neuen Suchbereich links und rechts gemäß dem Vergleich zwischen der Mitte Element und das gesuchte Element

 Die folgenden drei Schritte werden mit Diagrammen und Codes erklärt:

1. Angenommen, die Anzahl der Elemente im gegebenen Array ist eine ungerade Zahl

2. Nehmen Sie an, dass das gegebene Array eine gerade Zahl ist

 3. Nehmen Sie an, dass die angegebene Nummer nicht in dieser Reihenfolge ist

 Gemäß den oben genannten drei Situationen kann der Code wie folgt geschrieben werden:

#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 };
    int left = 0, right = sizeof(arr) / sizeof(arr[0]) - 1;
    int x = 0,flag = 0;

    scanf("%d", &x);//要找的数

    while (left <= right)//若要找的数在此数组中,此条件会一直成立;
                         //若要找的数不在此数组中,最终left会大于right,从循环中跳出
    {
        int mid = (left + right) / 2;
        if (x == arr[mid])
        {
            printf("%d\n", mid);
            flag = 1;
            break;
        }
        else if (x > arr[mid])
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    if (flag == 0)//只有当要找的数在数组中找不到时flag == 0
    {
        printf("找不到\n");
    }
    return 0;
}

 Zusammenfassung: Wie aus dem obigen Beispiel ersichtlich ist, ist die Dichotomie-Lösung eine sehr effiziente Methode, da die Hälfte der Möglichkeiten auf einmal ausgeschlossen werden kann. Beachten Sie aber auch, dass die Dichotomie nur für geordnete Sequenzen gilt

Zweitens die kleinen Punkte, auf die bei der Verzweigungsanweisung geachtet werden sollte

1. Dangling else-Anweisung

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

Im obigen Code könnte jemand falsch verstehen, welche if-Anweisung mit der else-Anweisung gepaart ist.

Tatsächlich: else passt auf das nächste if. Aber wenn es wie oben geschrieben ist, kann es leicht zu Mehrdeutigkeiten kommen. kann in folgender Form geschrieben werden:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

Die angemessene Verwendung von {} kann die Logik des Codes klarer machen.

2. Der Bruch in der switch-Anweisung

Schalter ermöglicht verschachtelte Verwendung

#include <stdio.h>
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;//m == 3
	case 2:
		n++;//n == 2
	case 3:
		switch (n)
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;//m == 4
			n++;//n == 3
			break;
		}
	case 4:
		m++;//m == 5, n == 3
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	return 0;
}

Im obigen Code folgt auf einige Case-Anweisungen kein Break, was dazu führt, dass eine Case-Anweisung darunter ausgeführt wird, nachdem eine Case-Anweisung ohne Break ausgeführt wurde, was zu einem anderen Ergebnis der Urteilsausgabe führen kann. Da Switch häufiger die Funktion der bedingten Beurteilung erfüllt, ist es am besten

Fügen Sie nach jeder gültigen case-Anweisung eine Pause ein. Beachten Sie auch, dass es sich bewährt hat, in jede switch-Anweisung eine default-Klausel einzufügen, und Sie können danach sogar eine Unterbrechung hinzufügen.

Supongo que te gusta

Origin blog.csdn.net/m0_74265792/article/details/130301993
Recomendado
Clasificación