ソートアルゴリズム(1)

選別

挿入ソート

直接挿入ソート

直接挿入ソートは、O(N^2) ソート アルゴリズムです。

0 インデックスから開始して逆方向に進む

void InsertSort(int* a,int n)//直接插入排序
{
    
    
	for (int i = 0; i < n - 1; i++)//n-1是因为不能数组越界
	{
    
    
		int emd = i;
		int tmp = a[emd+1];//保存一下emd的下一个数据防止在循环过程中被覆盖
		while (emd >= 0)//如果emd大于等于0 那么会遍历一次数组 并且排序
		{
    
    
			//每次都排序一次
			if (tmp < a[emd])//如果tmp比a[emd]小那么继续往前找
			{
    
    
				a[emd + 1] = a[emd];
			}
			else
			//如果tmp比a[emd]大那么跳出循环 
			//不直接赋值的原因是因为 有可能遍历完数组也没有tmp大的情况
			{
    
    
				break;
			}
			emd--;
		}
		a[emd + 1] = tmp;
	}
}

ヒルソート

ヒル ソートは O(N^1.3) ソート アルゴリズムです
ヒル ソートの方法は、配列に 前処理を施すことです の実行回数が多くなりますが、一定のレベルに達すると、これも減少傾向です ヒル ソート各添え字を比較する必要があります。添字 + ギャップの配列。それが未満の場合は、 交差一般に、前処理では配列をほぼ順序付けする

void ShellSort(int* a, int n)//希尔排序 时间复杂度O(N^1.3)
{
    
    
	//如果 gap = 1 那么就是有序排序
	int gap = n;//设置预排长度
	while (gap > 1)
	{
    
    
		gap /= 2;
		for (size_t 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的位置
					end -= gap;//如果end为负跳出循环 
				}
				else
				{
    
    
					break;
				}
			}
			a[end + gap] = tmp;//因为end变成负数了或者 break了 位置不变
		}
	}
}

選択ソート

直接選択ソート

直接選択ソート O(N^2) ソート アルゴリズム
直接選択ソートでは、最初にデータを選択できます現在のグループ a>です。その場合、前の位置は元の最小位置に割り当てられる必要があります最小の割り当てが先頭の位置である場合、最大値は次のとおりです。 位置は最後に、現在のグループの先頭と最後の位置に値を割り当てます。それを保存します 次に その後最小値と最大値


void SelectSort(int* a, int n)//直接选择排序 O(N^2)
{
    
    
	int begin = 0, end = n - 1;
	while (begin < end)
	{
    
    
		int min =begin, max = begin;
		for (size_t i = begin+1; i <=end; i++)//每排一次就确定一次当前排序的最大最小
		{
    
    
			if (a[i] > a[max])
			{
    
    
				max = i;
			}
			if (a[i] < a[min])
			{
    
    
				min = i;
			}
		}
		Sawp(&a[begin], &a[min]);
		if (max == begin)//如果 max == begin的话 min会先跟 begin这个位置换 所以要 赋值到换后min的位置
		{
    
    
			max = min;
		}
		Sawp(&a[end], &a[max]);
		begin++;
		end--;
	}
}

ヒープソート

ヒープ ソートは O(N*logN) ソート アルゴリズムです
ヒープ ソートはヒープ (大きなヒープ) を使用し、下方ソートを使用します
使用する理由大きな山?
小さなヒープを構築すると、ヒープの先頭の位置が入れ替わるため、そのヒープはヒープではなくなる可能性があります。
大きなヒープ内で変更されたヒープは影響を受けません。他の場所はヒープではありません

下方向に調整する
void AdjustDown(HPDataType* a, int n, int parent)//向下调整
{
    
    
	int child = parent * 2 + 1;
	while (child < n)//确保这个子树的下标 小于数组大小
	{
    
    
		if (child + 1 < n&&a[child + 1] < a[child])//child+1这个右子树不存在那么 则直接输出左子树
		//假设做孩子小 如果比右孩子小的话 ++换成右孩子
		{
    
    
			++child;
		}
		if (a[child] < a[parent])//小孩比父亲大那么交换(大堆)
			//小的孩子比 父亲小 那么交换(小堆)
		{
    
    
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
    
    
			break;
		}
	}

}
ヒープソート
void HeapSort(HPDataType* a, int n)//堆排序
{
    
    
	int end = n - 1;
	//向下调整的建大堆
	//o(n)
	for (int i = (end-1)/2; i >=0; i--)//i= 父亲节点
	{
    
    
		AdjustDown(a, n, i);
	}
	//向下排序
	//o(n*log(n))
	while (end >0)
	{
    
    
		Sawp(&a[0], &a[end]);
		AdjustDown( a, end, 0);
		end--;
	}
}

並べ替え

バブルソート

バブル ソートは O(N^2) ソート アルゴリズムです
バブル ソートは 2 つのループを使用して交換を実行します

void BubbleSort(int* a, int n)//冒泡排序
{
    
    
	for (int i = 0; i < n; i++)
	{
    
    
		int b = 0;
		for (int j = 1; j < n-i; j++)
		{
    
    
			
			if(a[j-1]>a[j])	
			{
    
    
				Sawp(&a[j-1], &a[j]);
				b = 1;
			}
			
		}
		if (b == 0)
		{
    
    
			break;
		}
	}
}

おすすめ

転載: blog.csdn.net/dabai__a/article/details/134171473