《算法导论》第2章:算法基础

本文详细介绍了几种常见的排序算法,包括插入排序(含递归版本)、选择排序和归并排序,并提供了具体的C++实现代码。此外,还探讨了算法的时间复杂度计算方法及算法正确性的验证步骤。

学习内容:

①算法(尤其是递归算法)复杂度的计算方法

②证明算法正确性的三个步骤            //虽然我没有怎么弄清楚

③几个排序算法的实现与比较

代码:

插入排序:

#include <iostream>
using namespace std;

int a[6] = {4,3,6,1,2,5};

int main()
{
	int i,j,key;

	for(j=1; j<6; ++j)
	{
		key = a[j];					//保存待插入的值
		i = j-1;

		//while(i>-1 && a[i]>key)	(降序)
		while(i>-1 && a[i]>key)		//比key大就向后移
		{
			a[i+1] = a[i];
			--i;
		}
		a[i+1] = key;				//此时a[i]为第一个不比key大的元素
	}

	for(i=0; i<6; ++i)
		cout<<a[i]<<' ';			//输出
	
	return 0;
}

插入排序(递归):

#include <iostream>
#include <ctime> 
using namespace std;

int a[6] = {4,3,6,1,2,5};

void insertSort(int cur)
{
	if(cur == 0) return;				
	insertSort(cur-1);					//递归直到a[0] 
	
	int key = a[cur];
	while(--cur > -1 && a[cur] > key)
		a[cur+1] = a[cur];
	a[cur+1] = key;
}

int main()
{
	int start = clock();
	insertSort(5);

	for(int i=0; i<6; ++i)
		cout<<a[i]<<' ';			//输出
		
	cout<<endl<<"Run time:"<<clock()-start; 
	return 0;
}

选择排序:

#include <iostream>
using namespace std;

int a[6] = {4,3,6,1,2,5};

int main()
{
	int temp,min,i,j;
	for(int i=0;i<5;++i)
	{
		min = i;
		for(j=i+1;j<6;++j)
			if(a[j]<a[min]) min = j;
		
		temp = a[min];
		a[min] = a[i];
		a[i] = temp;
	}
	
	for(i=0; i<6; ++i)
		cout<<a[i]<<' ';			//输出
	
	return 0;
}

归并排序(有哨兵):

#include <iostream>
#include <climits>				//定义了INT_MAX 
using namespace std;

int a[7] = {4,3,6,1,2,5,7};

void merge(int left, int mid, int right)
{
	int l[mid-left+2];			
	int r[right-mid+1];			//待归并的两个数组 
	
	l[mid-left+1] = INT_MAX;
	r[right-mid] = INT_MAX;		//将数组末项置为int型最大值 

	int i,j,k;
	for(i=0; i<mid-left+1; ++i)
		l[i] = a[left+i];
	for(j=0; j<right-mid; ++j)
		r[j] = a[mid+1+j];		//设置两个数组 

	i = j = 0;
	for(int k=left; k<=right; ++k)
	{
		if(l[i]<r[j]) a[k] = l[i++];	//归并的过程 
		else a[k] = r[j++];
	}
}

void mergeSort(int left,int right)
{
	if(left == right) return;

	int mid = (left + right) / 2;
	mergeSort(left, mid);			//二分(至只有一个元素)
	mergeSort(mid+1, right);

	merge(left,mid,right);			//归并
}

int main()
{
	mergeSort(0,6);					//对a[0,6]进行排序 

	for(int i=0; i<6; ++i)
		cout<<a[i]<<' ';			//输出

	return 0;
}

其它:

在求递归时间复杂度时,回忆起T1 = 1,Tn+1 = 2Tn + n(n>=2)下Tn的求法...

未解决问题:

2-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值