算法导论学习笔记一——算法基础

算法导论学习笔记一——算法基础

本文是机械工业出版社出版的《算法导论(原书第三版)》的学习笔记的第一篇,对应原书第2章——算法基础

算法1.插入排序
思想:首先在当前有序区R[1…i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后移一个位置,腾出k位置上的空间插入R[i].时间复杂度theta(n^2)。

void insert_sort(int* a, int n)
{
	int k,i;
	for (int j = 1; j < n; j++)
	{
		k = a[j];
		//insert
		i = j - 1;
		while ((i >= 0) & (a[i] > k))
		{
			a[i + 1] = a[i];
			i = i - 1;
		}
		a[i + 1] = k;
	}
}

算法2.选择排序
思想:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
与冒泡排序的区别:冒泡排序每发现当前元素小于下一个元素,就将他们交换,而选择排序在循环结束时才交换。
时间复杂度theta(n^2)。

void select_sort(int* a, int n)
{
	int k, i, min,idx_min;
	for (int j = 0; j < n; j++)
	{
		i = j;
		min = a[j];
		idx_min = i;
		while (i < n)
		{
			if ( min > a[i])
			{
				min = a[i];	
				idx_min = i;
			}
			i++;
		}
		swap(&a[j],&a[idx_min]);
	}
}

void swap(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

算法3.归并排序
算法导论学习笔记一——算法基础_第1张图片
时间复杂度:每层复杂度为cn,有lgn层,因此时间复杂度为theta(n lg n)。

void merge_sort(int* a, int p,int r)
{
	int q=0;
	if (p < r)
	{
		q = floor((p + r) / 2);
		merge_sort(a, p, q);
		merge_sort(a, q+1,r);
		merge(a, p, q, r);
	}
}
void merge(int* a, int p, int q, int r)
{
	
	int n1, n2,i,j;
	n1 = q - p + 1;
	n2 = r - q;
	int* r1 = new int[n1 + 1]; //动态分配数组
	int* r2 = new int[n2 + 1];
	for (int i = 0; i < n1; i++)
	{
		r1[i] = a[p + i];
	}
	r1[n1] = INT32_MAX;//哨兵数据
	for (int i = 0; i < n2; i++)
	{
		r2[i] = a[q + +1+i];
	}
	r2[n2] = INT32_MAX;
	//std::cout << "r1:"; show_arr(r1, n1 + 1);
	//std::cout << "r2:"; show_arr(r2, n2 + 1);

	i = 0; j = 0;
	for (int k = p; k <= r; k++)
	{
		if (r1[i] <= r2[j])
		{
			a[k] = r1[i];
			i++;
		}
		else
		{
			a[k] = r2[j];
			j++;
		}
	}
	delete[] r1;//记得释放内存
	delete[] r2;
}

你可能感兴趣的:(算法)