【データ構造】挿入、丘、選択、バブルの4つのソートアルゴリズム

1. ソートの概念とその応用

1.1 ソートアルゴリズムの概念

並べ替え: いわゆる並べ替えは、1 つまたはいくつかのキーワードのサイズに従って、レコードの文字列を昇順または降順に配置する操作です。
安定性:ソートされるレコードのシーケンス内に同じキーワードを持つ複数のレコードがあると仮定します。ソートされた場合、これらのレコードの相対的な順序は変更されませんつまり、元のシーケンスでは r[i]=r[j] 、かつ r[i] が r[j] より前にあり、ソートされたシーケンスでは r[i] がまだ r[j] より前にある場合、ソート アルゴリズムは安定していると言われます。そうでない場合は、不安定と呼ばれます
内部ソート:すべてのデータ要素がメモリ内に配置されるソート
外部ソート: 同時にメモリに配置できるデータ要素が多すぎるため、ソート プロセスの要件に従って内部メモリと外部メモリ間でデータのソートを移動できません。
 

1.2 ソートアルゴリズムの適用:

例えば、何かを買い直す場合には、その商品の価格、良いレビューの数、大学受験後の生徒の成績ランキング、学校のランキングなどです。

並べ替えアルゴリズムは日常生活で非常に頻繁に使用されるため、マスターしなければならないアルゴリズムです

1.3 一般的な並べ替えアルゴリズム

 2. ソートアルゴリズムの実装

2.1 直接挿入ソート

直接挿入ソートは単純な挿入ソートであり、その基本的な考え方は次のとおりです。

すべてのレコードが挿入され、新しい順序付きシーケンスが取得されるまで、キー値のサイズに従って並べ替えるレコードを 1 つずつ順序付きシーケンスに挿入します。

 i 番目 (i>=1) の要素を挿入するとき、前の array[0]、array[1]、...、array[i-1] はソートされており、このとき、array のソート コードを使用します。 [i] と Array[i-1]、array[i-2]、... はソート コードの順序を比較し、挿入位置を見つけて array[i] を挿入し、元の位置の要素の順序を計算します。後方に移動されます

昇順にソートする場合、挿入ソートは選択したデータを保存し、それより大きいデータを後ろに移動することと同じですが、その前にデータがない場合や、前のデータがそれより小さい場合は、数字を取り出し、順番に数字を並べ替えて、最終的に写真が完成します

void Insert(int* a, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

直接挿入ソート機能の概要:

1. 要素セットの順序が近いほど、直接挿入ソート アルゴリズムの時間効率が高くなります。

2.時間計算量は (N^2) です。コレクションが順序に近い場合、時間計算量は (N) です。

3. 空間の複雑さは (1)

4.安定性:安定しています

 2.2 ヒルソート

ヒル ソート法は、縮小増分法としても知られています。Hill ソート法の基本的な考え方は次のとおりです。まず整数ギャップを選択し、ソートするファイル内のすべてのレコードを n 個のグループに分割し、ギャップの距離を持つすべてのレコードを同じグループにグループ化し、レコードを次のようにソートします。各グループの 次に、gap/2 を順番に取り、上記のグループ化と並べ替えの作業を繰り返します。ギャップ = 1 に達すると、すべてのレコードが同じグループにソートされます。

 ギャップを順番に 2 で割ってギャップが 1 になったとき、このときのヒル ソートは直接挿入ソートと同等です。ヒル ソートは直接挿入ソートと似ており、配列を次のように分割します。いくつかのグループを事前にソートし、最後にギャップが 1 に等しい場合、配列のグループは順序に近くなります。その後、上記の方法を繰り返し、再び整列して OK になります。

void Shellsort(int* a, int n)
{
	int gap = n;
	while (gap > 0)
	{
		gap/=2;
		// i<n-gap防止越界!!
		for (int i = 0; i < n-gap; i ++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
		
	}
}

ヒルソートの特徴の概要:

1. ヒルソートは直接挿入ソートを最適化したものです

2. ギャップ > 1 の場合、事前にソートされます。目的は、配列を順序に近づけることです。配列が順序に近づくと、非常に高速になり、全体的な最適化効果が達成されます。

3. ギャップの値が一様ではないため、ヒルソートの時間計算量は計算が容易ではありません (約 O(n^1.25)~~O(1.6*n^1.25) )。

4. 安定性: 不安定

2.3 選択ソート

選択ソートの考え方: 毎回、最小の番号が選択され、開始位置の対応する番号が交換されます。

配列をトラバースすると、最小の数値を選択できると同時に最大の数値も選択できることがわかります。そのため、毎回最小の数値と最大の数値を選択し、最小の数値と開始位置を設定することができます。最初の添え字に対応する数値を交換し、最大の数値と最後の添え字に対応する数値を交換し、その後範囲を 1 つずつ絞り込んで循環します

void Swap(int* p1, int* p2)
{
		int tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
}

void Selectsort(int* a, int n)
{
	int left = 0, right = n - 1;
	while (left < right)
	{
		int maxi = left, mini = left;
		for (int i = left + 1; i <= right; i++)
		{
			if (a[maxi] < a[i])
			{
				maxi = i;
			}
			if (a[mini] > a[i])
			{
				mini = i;
			}
		}
			Swap(&a[left],&a[mini]);

			if (maxi == left)//为了防止最大的数的下标在起点位置,交换乱序
			{
				maxi = mini;
			}
			Swap(&a[right], &a[maxi]);
			left++;
			right--;
	}
}

選択ソートのプロパティの概要:

1. 時間計算量: O(N^2)

2. 空間の複雑さ: O(1)

3. 安定性: 不安定

2.4 バブルソート

バブル ソートは交換ソートの一種で、コアがバブリングし、配列内の最大のコアがバブルアップされ、バブルのプロセスは隣接する要素と交換されます。ソート対象のシーケンスを繰り返し訪問し、隣接するレコードのソート コードをペアごとに比較します。並べ替えプロセスでは、毎回最大値が前から後ろに取得され、シーケンス内の数値の最終位置が毎回決定されます。逆の順序が発生した場合は交換されます。バブリングには 2 つの方法があり、1 つは最初に小さな要素を前にバブリングする方法、もう 1 つは大きな要素を後ろにバブリングする方法です。次のコードは、大きな要素をバブリングすることです。要素は最初に背面に浸み込みます

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void bubbleosrt(int* a, int n)
{
	int end = n;
	while (end > 0)
	{
		int flag = 0;
		for (int i = 0; i < end-1; i++)
		{
			if (a[i + 1] < a[i])  //小于就交换
			{
				flag = 1;
				Swap(&a[i + 1], &a[i]);
			}
		}
		if (flag == 0)break;
		end--;
	}
}

バブルソートの概要

1. 時間計算量: O(N^2)

2. 空間の複雑さ: O(1)

3.安定性:安定しています

2.5 ヒープソート

ヒープ ソート この  ヒープ ソート実装に移動

おすすめ

転載: blog.csdn.net/m0_72532428/article/details/129958960
おすすめ