归并排序与快速排序

版权声明:博主的博客不值钱随便转载但要注明出处 https://blog.csdn.net/easylovecsdn/article/details/84641760

归并排序

归并的思想在于先分后排

“先分”:把整个序列划分为一个一个单段(O(logn))

“后排”:将相邻段内数据按照顺序放入新的数组,最后再将新数组的数据放回原数组(O(n))

由此总的时间复杂度为二者乘积=O(n*logn)

Code

#include <iostream>

using namespace std;

const int maxn = 10050;

int a[maxn];

void Merge(int left, int right)
{
	int *b = new int [right - left + 5];
	int mid = (left + right) / 2;
	int i = left, j = mid, k = 0;
	while (i < mid && j < right) b[k++] = a[i] < a[j] ? a[i++] : a[j++];

	while (i < mid) b[k++] = a[i++];
	while (j < right) b[k++] = a[j++];

	for (int c = 0; c < k; c++) a[left + c] = b[c];
}

void MergeSort(int left, int right)
{
	if (right - left > 1)
	{
		int mid = (left + right) / 2;
		MergeSort(left, mid);
		MergeSort(mid, right);
		Merge(left, right);
	}
}


void print(int n)
{
	for (int i = 0; i < n; i++)
	{
		if (i) cout << " ";
		cout << a[i];
	}
	cout << endl;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i];
	MergeSort(0, n);
	print(n);
	return 0;
}

快速排序

快速排序的思想与归并排序刚好相反,在于先排序,后分治

“先排序”:选定第一个元素作为基准,保证其插入一个合适的位置,使得该元素左边的元素都比其小,右边的都比其大;

“后分治”:在于将上一次选定的元素之前和之后的序列进行重新排序(记住是上一次确定位置的元素,而不是中点元素)

Code

#include <iostream>

using namespace std;

const int maxn = 10050;

int a[maxn];


void quicksort(int left, int right)
{
	if (right - left > 1)
	{
		int i = left, j = right - 1;
		int temp = a[i];

		do
		{
			while (i < j && a[j] > temp) j--;
			if (i < j)
			{
				a[i] = a[j];
				i++;
			}

			while (i < j && a[i] < temp) i++;
			if (i < j)
			{
				a[j] = a[i];
				j--;
			}

		} while (i != j);

		a[i] = temp;

		quicksort(left, i);
		quicksort(i + 1, right);
	}
}


void print(int n)
{
	for (int i = 0; i < n; i++)
	{
		if (i) cout << " ";
		cout << a[i];
	}
	cout << endl;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i];
	quicksort(0, n);
	print(n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/easylovecsdn/article/details/84641760