归并排序和快速排序(C++)

归并排序是一种经典的排序算法,也被称为“归并算法”。它的基本思想是将待排序数组分成若干个子数组,每个子数组都是有序的,然后将这些子数组合并成一个大的有序数组。

具体实现过程如下:

  1. 将待排序数组不断划分为左右两个子数组,直到每个子数组只有一个元素为止。

  2. 对每个子数组进行排序,可以使用插入排序等算法。

  3. 将相邻的两个子数组合并为一个有序数组,直到整个数组排序完成。

归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。虽然它的常数因子较大,但它稳定性好、适用于大规模数据排序等优点使得它在实际应用中得到广泛使用。

#include//归并排序
using namespace std;
int a[1000], n;
int b[1000];
void hebin(int l, int mid, int r)
{
	int p = l, q = mid + 1;
	for (int i = l; i <= r; i++)
	{
		if ((q > r) || (p <= mid && a[p] <= a[q]))
		{
			b[i] = a[p++];
		}
		else
		{
			b[i] = a[q++];
		}
	}
	for (int i = l; i <= r; i++)
		a[i] = b[i];
}
void merge_sort(int l,int r)
{
	if (l == r) return;
	int mid = (l + r) / 2;
	merge_sort(l, mid);    //对左边进行归并
	merge_sort(mid + 1, r);//对右边进行归并
	hebin(l, mid, r);     //合并
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	merge_sort(0, n-1);
	for (int i = 0; i < n; i++)
		cout << a[i]<<" ";
}

归并排序和快速排序(C++)_第1张图片

快速排序是一种高效的排序算法,基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

具体实现过程如下:

  1. 选择一个基准元素,通常选择第一个元素或者最后一个元素;
  2. 从序列的两端开始进行扫描,设立两个指示标志(low 和 high);
  3. 从后面开始扫描,如果发现有元素比基准元素小,则将其与基准元素交换;
  4. 从前面开始扫描,如果发现有元素比基准元素大,则将其与基准元素交换;
  5. 重复3和4步,直到 low 和 high 相遇;
  6. 将基准元素与 low 位置交换,这样就完成了一次排序;
  7. 递归地对基准元素左边的序列和右边的序列进行排序,直到整个序列有序为止。

快速排序的时间复杂度为 O(nlogn),是一种非常高效的排序算法。

#include//快排
using namespace std;
int a[1000];
void quick_sort(int l, int r)
{
	int i = l, j = r;
	int mid = (l + r) / 2;
	int x = a[mid];
	while (i <= j)
	{
		while (a[i] < x) i++;
		while (a[j] > x) j--;
		if (i<=j)
		{
			swap(a[i], a[j]);
			i++, j--;
		}
	}
	if (l < j) quick_sort(l, j);//对左边
	if (i < r) quick_sort(i, r);//对右边
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	quick_sort(0, n - 1);
	for (int i = 0; i < n; i++)
		cout << a[i]<<" ";
}

归并排序和快速排序(C++)_第2张图片

你可能感兴趣的:(算法,排序算法,数据结构)