アルゴリズムとデータ構造 (3) - ソートアルゴリズムの概要

6 つのソート アルゴリズム: 挿入ソート、ヒル ソート、選択ソート、バブル ソート、ヒープ ソート、クイック ソート

1. 挿入ソート

1. 最初の要素から開始して、要素はソートされていると見なされます。
2. 次の要素 tem を取得し、ソートされた要素シーケンスの後ろから前にスキャンします
。 3. 要素が tem より大きい場合は、要素を移動します。要素を次の 1
ビットに追加します。 4. 並べ替えられた要素の中で tem 以下の要素が見つかるまで手順 3 を繰り返します。
5. 並べ替えられたすべての要素が tem より大きい場合、tem が要素の後ろに挿入されます。添字 0 6 の位置に挿入します。
手順 2 ~ 5 を繰り返す
と、アニメーション効果は次のようになります。
画像の説明を追加してください
アイデア:
  並べ替える要素のうち、最初の n-1 個の要素が順番に並んでいると仮定して、n 番目の要素を前の要素に挿入します。最初の n 個の要素が順序付けされるように配列されたシーケンス。シーケンス全体が整うまで、この方法に従ってすべての要素を挿入します。
  しかし、ソートされる要素のどの部分が順序どおりであるかはわかりません。そのため、最初は最初の要素が順序どおりであると考えることしかできず、シーケンス全体が順序どおりになるまで、この順序付けられたシーケンスに次の要素を順番に挿入します。 。
C++ コードのデモは次のとおりです。

void InsertSort(int* arr, int n)
{
    
    
	//这是待插入的元素下标
	for (int i = 1; i < n; i++)
	{
    
    
		//这是已经排序好数组的下标
		for (int j = i - 1; j >= 0; j--)
		{
    
    
			//如果待排序数字大于,则向后移动
			if (arr[j] > arr[j + 1])
			{
    
    
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
			else
			{
    
    
				break;
			}
		}
	}

	//排序结果输出
	for (int i = 0; i < n; i++)
	{
    
    
		cout << arr[i] << "  ";
	}
}

時間計算量: ソート対象の列が逆順または逆順に近い場合、最悪の場合は O(N*N)、最良の場合は O(N)、ソート対象の列は昇順、または昇順に近い順。
空間の複雑さ: O(1)

2. 選択ソート

アイデア: 毎回並べ替える列から最小値を選択し、並べ替えるデータがすべてなくなるまでその値をシーケンスの先頭に置きます。
実際、1 回のパスで最大値と最小値の 2 つの値を選択し、それらをシーケンスの最初と最後に配置することができ、選択による並べ替えの効率を 2 倍にすることができます。
アニメーション効果は次のとおりです。
画像の説明を追加してください
C++ コードの実装:

void SelectSort(int* arr, int n)
{
    
    
	//开始从第一个元素进行选择排序
	for (int i = 0; i < n-1; i++)
	{
    
    
		//最小值下标暂存变量
		int min = i;
		//依次从待排序区域取出数据与准备排序的数据进行比较,并暂存最小值下标
		for (int j = i+1; j < n; j++)
		{
    
    
			//如果大于,则设置暂存变量
			if (arr[min] > arr[j])
			{
    
    
				min = j;
			}
		}
		//与找到的最小值下标互换数据
		int temp = arr[i];
		arr[i] = arr[min];
		arr[min] = temp;
	}

	//排序结果输出
	for (int i = 0; i < n; i++)
	{
    
    
		cout << arr[i] << "  ";
	}
}

時間計算量: 最悪の場合: O(N^2)
      最良の場合: O(N^2)
空間計算量: O(1)

3. バブルソート

アイデア:
左側は右側より大きく、最大のものは右側にあります。等々。
アニメーションは次のとおりです。
画像の説明を追加してください
C++ コードは次のとおりです。

void BubbleSort(int * arr, int len)
{
    
    

	//如果数组为空或者只有一个数组,则返回
	if (arr == NULL || len<2)
	{
    
    
		return;
	}

	//记录是否存在交换,如果不存在,则说明数组已经有序,直接退出,结束排序
	bool flag = false;
	
	//如果有两个以上的元素时,则开始排序
	//循环外圈
	for (int i = len ; i > 0; i--)
	{
    
    
		for (int j = 0; j < len; j++) 
		{
    
    
			//如果大于,则交换
			if (arr[j] > arr[j+1])
			{
    
    
				arr[j + 1] = arr[j + 1] ^ arr[j];
				arr[j] = arr[j + 1] ^ arr[j];
				arr[j + 1] = arr[j + 1] ^ arr[j];
				flag = true;
			}
		}
		if (!flag) 
			break;
		else 
			flag = false;
	}
	//显示排序结果
	for (int i = 0; i < len; i++)
	{
    
    
		cout << arr[i] << endl;
	}
}

時間計算量: 最悪の場合: O(N^2)
      最良の場合: O(N)
空間計算量: O(1)

4番目、マージソート

アイデア:
1. まず配列を分割します。

おすすめ

転載: blog.csdn.net/qq_52302919/article/details/130988394
おすすめ