バブルソート(愚か者のための教育)


一連の考え

讲解思路

バブル ソートは、次のように、順序付けされていないデータのセットを順序どおりに並べ替えることです。

順序なし: 1 3 2 6 4 7 5
順序あり: 1 2 3 4 5 6 7
次に、このデータ セットを順序どおりにする方法を検討する必要があります。最初にいくつかのステップを理解するのに役立ちます。
最初のステップは、前後を比較することです。私たちは、前の桁と次の桁を表す n や n+1 など、配列で実現できる
数学における数列に精通している必要があります。2 番目のステップでは、何回比較する必要があるかを考慮する必要があります。1 パス内の前後のビットを比較することで、ループ文を使用しているか分岐文を使用しているかを知ることができます。大まかなアイデアがあれば、運用を開始できます。



提示:以下是本篇文章正文内容,下面案例可供参考

1. 完全なコード

完整代码如下

void aa(int* arr, int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz - 1; i++)	//有多少趟,sz-1因为最后一个元素不需要排序
	{
    
    
		int j = 0;
		int a = 1;
		for (j = 0; j < sz - 1 - i;j++)		//一趟里的比较,sz-1-i这里是根据趟数的变化,比较次数也变化
		{
    
    
			if (arr[j] > arr[j + 1])		//比较判断,这里就相当数学里的数列n跟n+1,就是前一位跟后一位
			{
    
    
				int tem = arr[j];			//前后变量的交换,需要一个临时变量
				arr[j] = arr[j+1];
				arr[j + 1] = tem;
				a = 0;
			}
		}
		if (a == 1)
		{
    
    
			break;
		}
	}
}

int main()
{
    
    
	int arr[] = {
    
     1,4,7,3,8,2 };
	int sz = sizeof(arr) / sizeof(arr[0]);	//计算数组长度
	aa(arr, sz);
	for (int i = 0; i < sz; i++)
	{
    
    
		printf("%d ", arr[i]);
	}
}

2. コードの説明

1. 配列の長さを計算する

sizeof 関数を使用して配列の合計サイズを見つけ、それを配列の最初の要素で割って配列の長さを取得できます。

コードは次のとおりです(例)。

int main()
{
    
    
	int arr[] = {
    
     1,4,7,3,8,2 };
	int sz = sizeof(arr) / sizeof(arr[0]);	//计算数组长度
	aa(arr, sz);
	for (int i = 0; i < sz; i++)
	{
    
    
		printf("%d ", arr[i]);
	}
}

2. 配列パラメータの受け渡し

渡される arr は配列の最初の要素です。仮パラメータで実際のパラメータの値を変更したい場合は、必ずポインタを使用してください。sz は配列の計算値です。これを渡すことを忘れないでください。

コードは次のとおりです(例)。

//这里我就先简写了

//函数
void aa(int *arr, int sz);

//传参
aa(arr, sz);

ここで使用される URL ネットワークによって要求されたデータ。

3. ソート説明

ここでいくつかのステップに分けて説明します

这里是排序需要多少趟

int i = 0;
	for (i = 0; i < sz - 1; i++)	//有多少趟,sz-1因为最后一个元素不需要排序
	{
    
    
		
	}

一趟内的比较

int i = 0;
	for (i = 0; i < sz - 1; i++)	//有多少趟,sz-1因为最后一个元素不需要排序
	{
    
    
		int j = 0;					
		for (j = 0; j < sz - 1 - i;j++)		//一趟里的比较,sz-1-i这里是根据趟数的变化,比较次数也变化
		{
    
    
		
		}

前后位的比较

ここでは変数交換について詳しく説明します。
arr[j] の値は arr[j] = arr[j+1] のステップで arr[j+1] の値に変更されるため、前方変数と後方変数の交換には一時変数が必要です。一時変数が必要です。変数は arr[j] の値を保持します。
基本的

			if (arr[j] > arr[j] + 1])		//比较判断,这里就相当数学里的数列n跟n+1,就是前一位跟后一位
			{
    
    
				int tem = arr[j];			
				arr[j] = arr[j+1];
				arr[j + 1] = tem;
			}

代码优化

Orderlyは交換する必要はありません。データが交換されているかどうかを一時変数aを使用して監視できます。aが交換されていれば= 0になります。交換がなければ1は変化しません。その後、ifとbreakを直接使用しますループから抜け出すために。

void aa(int* arr, int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz - 1; i++)	
	{
    
    
		int j = 0;
		int a = 1;
		for (j = 0; j < sz - 1 - i;j++)		
		{
    
    
		int a = 0;
		}
		if (a == 1)
		{
    
    
			break;
		}
	}
}


要約する

有讲解的不好的地方还请指正

おすすめ

転載: blog.csdn.net/m0_66977204/article/details/130535804