插入排序,选择排序,递归排序和冒泡排序的实现

以下是根据算法导论中伪码实现的几种排序方式,包括插入排序,选择排序,递归排序和冒泡排序。

<pre name="code" class="cpp">#include <iostream>
using std::cout;
// the insertion sort
void Insertion_sort(double* t_dpSeq,unsigned long t_ulSeqLen)
{
	double dKey;
	long lIndex;
	for (unsigned long ulTemp = 1; ulTemp < t_ulSeqLen; ulTemp++)
	{
		dKey = t_dpSeq[ulTemp];
		lIndex = ulTemp - 1;
		while (lIndex >= 0 && t_dpSeq[lIndex] > dKey)
		{
			t_dpSeq[lIndex + 1] = t_dpSeq[lIndex];
			lIndex--;
		}
		t_dpSeq[lIndex + 1] = dKey;
	}
}

// the choose sort
void Choose_sort(double* t_dpSeq, unsigned long t_ulSeqLen)
{
	double dMin;
	long lPos;
	for (unsigned long ulTemp = 0; ulTemp < t_ulSeqLen - 1; ulTemp++)
	{
		dMin = t_dpSeq[ulTemp];
		lPos = ulTemp;
		for (unsigned long ulIndex = ulTemp + 1; ulIndex < t_ulSeqLen; ulIndex++)
		{
			if (t_dpSeq[ulIndex] < dMin)
			{
				dMin = t_dpSeq[ulIndex];
				lPos = ulIndex;
			}	
		}
		t_dpSeq[lPos] = t_dpSeq[ulTemp];
		t_dpSeq[ulTemp] = dMin;
	}
}

// the merge sort
void Merge(double* t_dpSeq, unsigned long t_ulBegin, unsigned long t_ulMiddle, unsigned long t_ulEnd)
{
	unsigned long ulLen1, ulLen2, ulIndex1, ulIndex2;
	ulLen1 = t_ulMiddle - t_ulBegin + 1;
	ulLen2 = t_ulEnd - t_ulMiddle;
	double* dpUpSeq = new double[(ulLen1 + 1)*sizeof(double)];
	double* dpDownSeq = new double[(ulLen2 + 1)*sizeof(double)];
	for (unsigned long ulTemp = 0; ulTemp < ulLen1; ulTemp++)
	{
		dpUpSeq[ulTemp] = t_dpSeq[t_ulBegin + ulTemp];
	}
	for (unsigned long ulTemp = 0; ulTemp < ulLen2; ulTemp++)
	{
		dpDownSeq[ulTemp] = t_dpSeq[t_ulMiddle + ulTemp + 1];
	}
	dpUpSeq[ulLen1] = 1e10;
	dpDownSeq[ulLen2] = 1e10;
	ulIndex1 = 0;
	ulIndex2 = 0;
	for (unsigned long ulIndex = t_ulBegin; ulIndex <= t_ulEnd; ulIndex++)
	{
		if (dpUpSeq[ulIndex1] <= dpDownSeq[ulIndex2])
		{
			t_dpSeq[ulIndex] = dpUpSeq[ulIndex1];
			ulIndex1++;
		}
		else
		{
			t_dpSeq[ulIndex] = dpDownSeq[ulIndex2];
			ulIndex2++;
		}
	}
	delete[]dpUpSeq;
	delete[]dpDownSeq;
}
void Merge_inner(double* t_dpSeq, unsigned long t_ulBegin, unsigned long t_ulEnd)
{
	unsigned long ulMiddle;
	if (t_ulBegin < t_ulEnd)
	{
		ulMiddle = (t_ulBegin + t_ulEnd) / 2;
		Merge_inner(t_dpSeq, t_ulBegin, ulMiddle);
		Merge_inner(t_dpSeq, ulMiddle + 1, t_ulEnd);
		Merge(t_dpSeq, t_ulBegin, ulMiddle, t_ulEnd);
	}
}
void Merge_sort(double* t_dpSeq, unsigned long t_ulSeqLen)
{
	unsigned long ulBegin = 0, ulEnd = t_ulSeqLen - 1;
	Merge_inner(t_dpSeq, ulBegin, ulEnd);
}

// the bubble sort
void Bubble_sort(double* t_dpSeq, unsigned long t_ulSeqLen)
{
	double dTemp;
	for (unsigned long ulTemp = 0; ulTemp < t_ulSeqLen - 1; ulTemp++)
	{
		for (unsigned long ulIndex = t_ulSeqLen - 1; ulIndex > ulTemp; ulIndex--)
		{
			if (t_dpSeq[ulIndex] < t_dpSeq[ulIndex - 1])
			{
				dTemp = t_dpSeq[ulIndex];
				t_dpSeq[ulIndex] = t_dpSeq[ulIndex - 1];
				t_dpSeq[ulIndex - 1] = dTemp;
			}
		}
	}
}
int main()
{
	double dSeq[10] = { 11, 33, 20, 9, 80, 22, 31, 49, 78, 96 };
	unsigned long ulSeqLen = 10;
	//Insertion_sort(dSeq, ulSeqLen);
	//Choose_sort(dSeq, ulSeqLen);
	//Merge_sort(dSeq, ulSeqLen);
	Bubble_sort(dSeq, ulSeqLen);
	for (unsigned long ulTemp = 0; ulTemp < ulSeqLen; ulTemp++)
	{
		cout << dSeq[ulTemp] << " ";
	}
	system("pause");
}

 


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值