C++基于比较的排序算法实现

本文深入探讨了多种排序算法的实现,包括插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序和归并排序。通过代码示例详细解释了每种算法的工作原理和步骤,为读者提供了丰富的学习资源。
#include <iostream>
#include <algorithm>
#include <time.h>

using namespace std;

void swap(int *arr, int m, int n);
void printArray(int *arr, int size);
int *generateRandomArray(int maxSize, int maxValue, int &size);
bool isEqual(int firstArr[], int secondArr[], int size);
int *copyArray(int oldArray[], int size);
void comarator(int *arr, int size);

//插入排序
void insertionSort(int *arr, int size);
//希尔排序
void shellSort(int *arr, int size);
void groupSort(int* a, int n, int i, int gap);
//选择排序
void selectionSort(int *arr, int size);
//堆排序
void heapInsert(int *arr, int index);
void heapify(int *arr, int index, int size);
void heapSort(int *arr, int size);
//冒泡排序
void bubbleSort(int *arr, int size);
//快速排序
void quickSort(int *arr, int size);
void quickSort(int *arr, int size, int l, int r);
int partition(int *arr, int size, int l, int r);
//归并排序
void mergeSort(int *arr, int size);
void mergeSort(int *arr, int size, int l, int r);
void merge(int *arr, int size, int l, int mid, int r);


bool forTest = false;
int srandNum1 = 0;
int srandNum2 = 100;


int main()
{
	if (!forTest)
	{
		int size = 0;
		int testTime = 5000;
		int maxSize = 10;
		int maxValue = 10;
		bool succeed = true;
		for (int i = 0; i < testTime; i++)
		{
			int *arr1 = generateRandomArray(maxSize, maxValue, size);
			int *arr2 = copyArray(arr1, size);
			mergeSort(arr1, size);
			comarator(arr2, size);
			if (!isEqual(arr1, arr2, size))
			{
				succeed = false;
				printArray(arr1, size);
				printArray(arr2, size);
				break;
			}
		}
		if (succeed)
		{
			cout << "Nice!" << endl;
		}
		else
		{
			cout << "Fucking Fucked" << endl;
		}
	}
	else
	{
		int arr[5] = { 6,4,9,5,7 };
		mergeSort(arr, 5);
		printArray(arr, 5);
	}
	system("pause");
	return 0;
}

void swap(int *arr, int m, int n)
{
	int temp = arr[m];
	arr[m] = arr[n];
	arr[n] = temp;

	//arr[m] = arr[m] ^ arr[n];
	//arr[n] = arr[m] ^ arr[n];
	//arr[m] = arr[m] ^ arr[n];

}

void printArray(int *arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

int *generateRandomArray(int maxSize, int maxValue, int &size)
{
	srandNum1 += 3;
	srandNum2++;
	srand((unsigned)time(NULL)*srandNum1*srandNum1*srandNum2*srandNum2*srandNum2);
	size = (int)(rand() % (maxSize)+1);

	int *arr = new int[size];
	for (int i = 0; i < size; i++)
	{
		//arr[i] = ((rand() % (2 * maxValue)) - maxValue);
		arr[i] = (rand() % maxValue);
	}
	//printArray(arr, size);
	return arr;
}

void comarator(int *arr, int size)
{
	sort(arr, arr + size);
	//sort类函数
	//sort(begin,end,cmp):cmp参数省缺时进行升序排序
	//		cmp参数使用类模板:less<data - type>()升序;greater<data-type>()降序。
	//stable_sort:对指定区间进行稳定排序
	//is_sorted:判断一个区间是否已经排好序
}

int *copyArray(int oldArray[], int size)
{
	if (size == 0)
	{
		return nullptr;
	}
	int *newArray = new int[size];
	for (int i = 0; i < size; i++)
	{
		newArray[i] = oldArray[i];
	}
	return newArray;
}

bool isEqual(int firstArr[], int secondArr[], int size)
{
	if (size == 0)
	{
		return true;
	}
	for (int i = 0; i < size; i++)
	{
		if (firstArr[i] != secondArr[i])
		{
			return false;
		}
	}
	return true;
}

void insertionSort(int *arr, int size)
{
	if (size == 0 || size == 1)
	{
		return;
	}
	for (int i = 0; i < size; i++)
	{
		for (int j = i; j > 0; j--)
		{
			if (arr[j-1]>arr[j])
			{
				swap(arr, j - 1, j);
			}
		}
	}
}

void shellSort(int *arr, int size)
{
	for (int gap = size / 2; gap > 0; gap /= 2)
	{
		// 共gap个组,对每一组都执行直接插入排序
		for (int i = 0;i < gap; i++)
		groupSort(arr, size, i, gap);
	}
}

void groupSort(int* arr, int size, int i, int gap)
{
	for (int j = i + gap; j < size; j += gap)
	{
		for (int k = j; k > i ; k-= gap)
		{
			if (arr[k - gap]>arr[k])
			{
				swap(arr, k - gap, k);
			}
		}
	// 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
		//if (arr[j] < arr[j - gap])
		//{
		//	int tmp = arr[j];
		//	int k = j - gap;
		//	while (k >= 0 && arr[k] > tmp)
		//	{
		//		arr[k + gap] = arr[k];
		//		k -= gap;
		//	}
		//	arr[k + gap] = tmp;
		//}
	}
}

void selectionSort(int *arr, int size)
{
	if (size == 0 || size == 1)
	{
		return;
	}
	int min = 65535;
	int minIndex = 0;
	for (int i = 0; i < size; i++)
	{
		for (int j = i; j < size; j++)
		{
			if (arr[j] < min)
			{
				min = arr[j];
				minIndex = j;
			}
		}
		swap(arr, i, minIndex);
		min = 65535;
	}
}

void bubbleSort(int *arr, int size)
{
	if (size == 0 || size == 1)
	{
		return;
	}
	for (int i = size-1; i >0; i--)
	{
		for (int j = 0; j < i; j++)
		{
			if (arr[j + 1] < arr[j])
			{
				swap(arr, j + 1, j);
			}
		}
	}

}

void heapInsert(int *arr, int index)
{
	while (arr[index]>arr[(index - 1) / 2])
	{
		swap(arr, index, (index - 1) / 2);
		index = (index - 1) / 2;
	}
}

void heapify(int *arr, int index, int heapSize)
{
	int left = 2 * index + 1;
	while (left < heapSize)
	{
		int maxIndex;
		if ((left + 1 < heapSize) && (arr[left + 1] > arr[left]))
		{
			maxIndex = left + 1;
		}
		else
		{
			maxIndex = left;
		}
		//注意下面这段代码,自己写的时候忘记加了,导致错误。
		maxIndex = arr[maxIndex] > arr[index] ? maxIndex : index;
		if (maxIndex == index)
		{
			break;
		}

		swap(arr, index, maxIndex);
		index = maxIndex;
		left = 2 * index + 1;
	}
}

void heapSort(int *arr, int size)
{
	if (size == 1)
	{
		return;
	}
	for (int i = 0; i < size; i++)
	{
		heapInsert(arr, i);
	}

	//printArray(arr, size);
	swap(arr, 0, --size);
	while (size>0)
	{
		heapify(arr, 0, size);
		swap(arr, 0, --size);
	}
}

void mergeSort(int *arr, int size)
{
	if (size ==0 || size==1)
	{
		return;
	}
	mergeSort(arr, size, 0, size - 1);
}

void mergeSort(int *arr, int size, int l, int r)
{
	if (l == r)	return;
	int mid = (l + r) / 2;
	mergeSort(arr, size, l, mid);
	mergeSort(arr, size, mid + 1, r);
	merge(arr, size, l, mid, r);
}

void merge(int *arr, int size, int l, int m, int r)
{
	int num = r - l + 1;
	int *help = new int[num];
	int i = 0;
	int p1 = l;
	int p2 = m + 1;
	while (p1 <= m && p2 <= r)
	{
		help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
	}
	while (p1 <= m)
	{
		help[i++] = arr[p1++];
	}
	while (p2 <= r)
	{
		help[i++] = arr[p2++];
	}
	for (i = 0; i < num; i++)
	{
		arr[l + i] = help[i];
	}
	delete[] help;
}

void quickSort(int *arr, int size)
{
	if (size == 0 || size ==1)
	{
		return;
	}
	quickSort(arr, size, 0, size - 1);
}

void quickSort(int *arr, int size, int low, int high)
{
	if (low < high)
	{
		int q = partition(arr, size, low, high);
		quickSort(arr, size, low, q - 1);
		quickSort(arr, size, q + 1, high);

	}
}

int partition(int *arr, int size, int low, int high)
{
	int pivot = arr[high];//拿最后一个数进行划分
	int mid = low;//小于区域的下一个数
	for (int i = low; i < high + 1; i++)
	{
		if (arr[i] < pivot)	swap(arr, i, mid++);
	}
	swap(arr, mid, high);
	return mid;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值