数据结构与算法每日一练---排序算法---0x0000

数据结构与算法每日一练---排序算法---0x0000


头文件

#pragma once

#include <vector>

using namespace std;

class SortFunction
{
public:
	static void CreatRandom(vector<int>& vecData, int nNumber);

	static void BubbleSort(vector<int>& vecData);			// 冒泡排序

	static void SelectionSort(vector<int>& vecData);		// 选择排序

	static void InsertSort(vector<int>& vecData);			// 插入排序

	static void ShellSort(vector<int>& vecData);			// 希尔排序(内部使用了插入排序的方式)

	static void QuikSort(vector<int>& vecData);				// 快速排序

	static void HeapSort(vector<int>& vecData);				// 堆排序

	static void MergeSort(vector<int>& vecData);			// 合并排序

private:
	/**
	 *@brief 快速排序
	 */
	static void QuikSort(vector<int>& vecData, int nStart, int nEnd);

	static int PartSort(vector<int>& vecData, int nStart, int nEnd);

	/**
	 *@brief 堆排序  
	 */
	static void BuildHeap(vector<int>& vecData, int nEndIndex);

	static void BuildNodeHeap(vector<int>& vecData, int nIndex, int nEndIndex);

	/**
	 *@brief 合并排序
	 */
	static void MergeStep(vector<int>& vecSrcData, vector<int>& vecDesData, int nStart, int nMiddle, int nEnd);
	
	static void MergePass(vector<int>& vecSrcData, vector<int>& vecDesData, int nSpace);

	/**
	 *@brief 通用的部分
	 */
	static void Swap(vector<int>& vecData, int nIndexA, int nIndexB);

	static bool IsValueExist(const vector<int>& vecData, int nValue);
};

源文件

#include "SortFunction.h"
#include <ctime>

void SortFunction::CreatRandom(vector<int>& vecData, int nNumber)
{
	srand(static_cast<int>(time(nullptr)));

	vecData.clear();

	int nValue = 0;

	for (int i = 0; i != nNumber; ++i)
	{
		nValue = rand() % 100;
		
		if (IsValueExist(vecData, nValue))
		{
			i--;
		}
		else
		{
			vecData.push_back(nValue);
		}
	}
}

void SortFunction::BubbleSort(vector<int>& vecData)
{
	if (vecData.empty())
		return;

	int nSize = static_cast<int>(vecData.size());

	for (int i = 0; i != nSize - 1; ++i)
	{
		for (int nIndex = nSize - 1; nIndex != i; --nIndex)
		{
			if (vecData[nIndex] < vecData[nIndex - 1])
				Swap(vecData, nIndex - 1, nIndex);
		}
	}
}

void SortFunction::SelectionSort(vector<int>& vecData)
{
	if (vecData.empty())
		return;

	int nSize = static_cast<int>(vecData.size());

	for (int i = 0; i != nSize - 1; ++i)
	{
		int nMinIndex = i;

		for (int nIndex = i; nIndex != nSize; ++nIndex)
		{
			if (vecData[nIndex] < vecData[nMinIndex])
				nMinIndex = nIndex;
		}

		Swap(vecData, i, nMinIndex);
	}
}

void SortFunction::InsertSort(vector<int>& vecData)
{
	if (vecData.empty())
		return;

	int nSize = static_cast<int>(vecData.size());

	for (int i = 1; i != nSize; ++i)
	{
		int nValue = vecData[i];
		int nIndex = i - 1;

		while (nIndex >= 0 && vecData[nIndex] > nValue)
		{
			vecData[nIndex + 1] = vecData[nIndex];
			nIndex--;
		}

		vecData[nIndex + 1] = nValue;
	}
}

void SortFunction::ShellSort(vector<int>& vecData)
{
	if (vecData.empty())
		return;

	int nSize = static_cast<int>(vecData.size());
	int nSpace = nSize / 2;

	while (nSpace >= 1)
	{
		for (int i = nSpace; i != nSize; ++i)
		{
			int nValue = vecData[i];
			int nIndex = i - nSpace;

			while (nIndex >= 0 && vecData[nIndex] > nValue)
			{
				vecData[nIndex + nSpace] = vecData[nIndex];
				nIndex -= nSpace;
			}

			vecData[nIndex + nSpace] = nValue;
		}

		nSpace /= 2;
	}
}

void SortFunction::QuikSort(vector<int>& vecData)
{
	if (vecData.empty())
		return;

	int nSize = static_cast<int>(vecData.size());

	QuikSort(vecData, 0, nSize - 1);
}

void SortFunction::QuikSort(vector<int>& vecData, int nStart, int nEnd)
{
	if (nStart < nEnd)
	{
		int nMiddle = PartSort(vecData, nStart, nEnd);

		QuikSort(vecData, nStart, nMiddle - 1);
		QuikSort(vecData, nMiddle + 1, nEnd);
	}
}

void SortFunction::HeapSort(vector<int>& vecData)
{
	if (vecData.empty())
		return;

	int nSize = static_cast<int>(vecData.size());

	for (int i = 0; i != nSize - 1; ++i)
	{
		BuildHeap(vecData, nSize - i - 1);
		Swap(vecData, 0, nSize - i - 1);
	}
}

int SortFunction::PartSort(vector<int>& vecData, int nStart, int nEnd)
{
	int nValue = vecData[nEnd];
	int nIndex = nStart;

	for (int i = nStart; i != nEnd; ++i)
	{
		if (vecData[i] < nValue)
		{
			Swap(vecData, nIndex, i);
			nIndex++;
		}
	}

	Swap(vecData, nIndex, nEnd);

	return nIndex;
}

void SortFunction::BuildHeap(vector<int>& vecData, int nEndIndex)
{
	for (int i = (nEndIndex - 1) / 2; i >= 0; --i)
		BuildNodeHeap(vecData, i, nEndIndex);
}

void SortFunction::BuildNodeHeap(vector<int>& vecData, int nIndex, int nEndIndex)
{
	int nLeft = (nIndex << 1) + 1;
	int nRight = ((nIndex + 1) << 1);

	int nMaxIndex = nIndex;

	if (nLeft <= nEndIndex && vecData[nLeft] > vecData[nMaxIndex])
		nMaxIndex = nLeft;

	if (nRight <= nEndIndex && vecData[nRight] > vecData[nMaxIndex])
		nMaxIndex = nRight;

	if (nMaxIndex != nIndex)
	{
		Swap(vecData, nIndex, nMaxIndex);
		BuildNodeHeap(vecData, nMaxIndex, nEndIndex);
	}
}

void SortFunction::MergeStep(vector<int>& vecSrcData, vector<int>& vecDesData, int nStart, int nMiddle, int nEnd)
{
	int nIndex = nStart;
	int nSrcFontIndex = nStart;
	int nSrcBackIndex = nMiddle + 1;

	while (nSrcFontIndex <= nMiddle && nSrcBackIndex <= nEnd)
	{
		if (vecSrcData[nSrcFontIndex] < vecSrcData[nSrcBackIndex])
		{
			vecDesData[nIndex++] = vecSrcData[nSrcFontIndex++];
		}
		else
		{
			vecDesData[nIndex++] = vecSrcData[nSrcBackIndex++];
		}
	}

	while (nSrcFontIndex <= nMiddle)
		vecDesData[nIndex++] = vecSrcData[nSrcFontIndex++];

	while (nSrcBackIndex <= nEnd)
		vecDesData[nIndex++] = vecSrcData[nSrcBackIndex++];
}

void SortFunction::MergePass(vector<int>& vecSrcData, vector<int>& vecDesData, int nSpace)
{
	int nSize = static_cast<int>(vecSrcData.size());

	int nStart = 0;
	int nMiddle = 
}

void SortFunction::Swap(vector<int>& vecData, int nIndexA, int nIndexB)
{
	if (nIndexA == nIndexB)
		return;

	int nTemp = vecData[nIndexA];
	vecData[nIndexA] = vecData[nIndexB];
	vecData[nIndexB] = nTemp;
}

bool SortFunction::IsValueExist(const vector<int>& vecData, int nValue)
{
	for (int nTemp : vecData)
	{
		if (nValue == nTemp)
			return true;
	}

	return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值