算法基础篇-七种内排序算法C++实现

七种内排序算法,目前只写了代码,原理解析待补充:

1.交换类排序:冒泡、快排;

2.选择类排序:选择、堆排序;

3.插入类排序:直接插入、希尔;

4.归并排序

测试用例:

5
1 2 4 3 -3
10
100 293 123 212 293 434 5 12 439 3

Todo:

原理、复杂度解析与稳定性解析。

#include<iostream>
using namespace std;

int n;

//print current array
void echo(int a[])
{
	if (a==nullptr || n <= 0) { cout << "null error" << endl; return; }
	for (int i = 0; i < n-1; i++)
	{
		cout << a[i] << " ";
	}
	cout << a[n - 1] << endl;
}

//swap a[i] and a[j]
void swap(int a[], int i, int j)
{
	if (a[i] == a[j]) { return; }
	a[i] ^= a[j];
	a[j] ^= a[i];
	a[i] ^= a[j];
}


//1.Bubble Sort
void BubbleSort(int a[])
{
	if (a == nullptr) { return; }
	int flag = 1;
	for (int i = 0; i < n-1 && flag; i++)
	{
		flag = 0;
		for (int j = 0; j < n - i - 1; j++)
		{
			if (a[j]>a[j+1])
			{
				flag = 1;
				swap(a,j,j+1);
				echo(a);
			}
		}
	}
}

//2.Quick Sort
void QuickSort(int a[], int left, int right)
{
	if (a == nullptr || left >= right) { return; }
	int i = left, j = right;
	int tmp = a[i];
	while (i<j)
	{
		while (i < j && tmp <= a[j])
		{
			--j;
		}
		if (i<j)
		{
			a[i] = a[j];
		}
		while (i<j && a[i] <= tmp)
		{
			++i;
		}
		if (i<j)
		{
			a[j] = a[i];
		}
	}
	a[i] = tmp;
	echo(a);
	QuickSort(a, left, i - 1);
	QuickSort(a, i + 1, right);
}

//3.Select Sort
void SelectSort(int a[])
{
	for (int i = 0; i < n - 1; i++)
	{
		int maxi = 0;
		for (int j = 0; j < n - i; j++)
		{
			if (a[j]>a[maxi])
			{
				maxi = j;
			}
		}
		swap(a, n - i - 1, maxi);
		echo(a);
	}
}

//4.Heap Sort
void AdjustHeap(int a[], int i, int last)
{
	int left = 2 * i + 1, right = 2 * i + 2, tmp = a[i];
	while (left<last)
	{
		int maxi = left;
		if (right<last && a[left] < a[right]) { maxi = right; }
		if (tmp < a[maxi]) 
		{
			a[i] = a[maxi];
			i=maxi;
			left = 2 * i + 1, right = 2 * i + 2;
			echo(a);
		}
		else { break; }
	}
	a[i] = tmp;
}

void InitHeap(int a[])
{
	int t = (n - 1) / 2;
	for (; t >= 0; t--)
	{
		AdjustHeap(a, t, n);
	}
	cout << "heap init done." << endl;
}

void HeapSort(int a[])
{
	InitHeap(a);
	for (int i = 0; i < n - 1; i++)
	{
		AdjustHeap(a, 0, n - i);
		swap(a, 0, n - i - 1);
		echo(a);
	}
}

//5.Insert Sort
void InsertSort(int a[])
{
	for (int i = 1; i < n; i++)
	{
		int tmp = a[i], j = i - 1;
		while (j >= 0 && a[j]>tmp)
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = tmp;
		echo(a);
	}
}

//6.Shell Sort
void ShellSort(int a[])
{
	for (int pace = n/2; pace >= 1; pace/=2)
	{
		for (int i = pace; i < n; i++)
		{
			int tmp = a[i];
			int j = i;
			while (j>=pace && tmp<a[j-pace])
			{
				a[j] = a[j - pace];
				j -= pace;
			}
			a[j] = tmp;
			echo(a);
		}
	}
}

//7.Merge Sort
void merge(int a[], int left, int mid, int right)
{
	if (a == nullptr || left > mid || mid > right) { return; }
	int i = left, j = mid + 1, len = right - left + 1;
	int* tmpMerge = new int[len]{ 0 };
	int k = 0;
	while (i<=mid && j<=right)
	{
		if (a[i] < a[j]) { tmpMerge[k++] = a[i++]; }
		else { tmpMerge[k++] = a[j++]; }
	}
	while (i <= mid) { tmpMerge[k++] = a[i++]; }
	while (j <= right) { tmpMerge[k++] = a[j++]; }

	memcpy(&a[left], tmpMerge, len * sizeof(int));

	delete[] tmpMerge;
}

void MergeSort(int a[], int left, int right)
{
	if (a == nullptr || left >= right) { return; }
	int mid = (left + right) / 2;
	MergeSort(a, left, mid);
	MergeSort(a, mid + 1, right);
	merge(a, left, mid, right);
	echo(a);
}


int main()
{
	cout << "Input numbers of array: ";
	while (cin>>n)
	{
		int* a = new int[n];
		cout << "Input array: ";
		for (int i = 0; i < n; i++)
		{
			cin >> a[i];
		}
		int* tmp = new int[n];
		memcpy(tmp, a, n * sizeof(int));

		cout << "Bubble Sort:" << endl;
		echo(a);
		BubbleSort(a);

		memcpy(a, tmp, n * sizeof(int));
		cout << "Quick Sort:" << endl;
		echo(a);
		QuickSort(a, 0, n - 1);

		memcpy(a, tmp, n * sizeof(int));
		cout << "Select Sort:" << endl;
		echo(a);
		SelectSort(a);
		
		memcpy(a, tmp, n * sizeof(int));
		cout << "Heap Sort:" << endl;
		echo(a);
		HeapSort(a);

		memcpy(a, tmp, n * sizeof(int));
		cout << "Insert Sort:" << endl;
		echo(a);
		InsertSort(a);

		memcpy(a, tmp, n * sizeof(int));
		cout << "Shell Sort:" << endl;
		echo(a);
		ShellSort(a);

		memcpy(a, tmp, n * sizeof(int));
		cout << "Merge Sort:" << endl;
		echo(a);
		MergeSort(a, 0, n - 1);

		delete[] tmp;
		delete[] a;

		cout << endl << "Input numbers of array: ";
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/Rick1860/article/details/82831537