您的位置:首页 > 其它

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

2020-01-13 13:27 78 查看

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

本文是机械工业出版社出版的《算法导论(原书第三版)》的学习笔记的第一篇,对应原书第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.归并排序

时间复杂度:每层复杂度为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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
lidi_xdu 发布了3 篇原创文章 · 获赞 0 · 访问量 46 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: