保研机试复习(一)——算法初步

文章目录

  • 1. 排序
    • 1.1 选择排序
    • 1.2 插入排序
    • 1.3 sort排序
    • 1.4 排名的实现
  • 2. 散列
    • 2.1 整数散列
    • 2.2 字符串hash
    • 2.3 map

参考资料
[1] 算法笔记——胡凡、曾磊

1. 排序

1.1 选择排序

(1)算法思路
对于序列a[n]中的元素1~n:

  • 令i从1到n枚举,进行n次操作。
  • 每趟从待排序部分a[1:n]中选择最小元素,并与待排序部分第一个元素a[i]交换。
  • a[i]与有序部分a[1:i-1]形成新的有序部分。
  • 进行n次操作,a[n]变成有序序列。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

核心代码:
找到最小元素 --> 与首个元素交换 --> 循环n次

void selectSort() {
   
	for(int i=1; i<=n; i++){
   
	// 1. find arg min a[i:n]
		int k =i;
		for(int j=i; j<=n; j++) {
   
			if (a[j] <a[k])
				k = j;
		}
	// 2. swap a[k] and a[i]
		int temp =a[i];
		a[i] =a[k];
		a[k] =temp;
	}
}

1.2 插入排序

(1)算法思路
对于序列a[n]中的元素1~n:

  • 令i从2到n枚举,进行n-1次操作。
  • 假设在某一趟时,序列a[1:i-1]为有序,a[i:n]未排序。则需要在a[1:i-1]中找到位置j,使a[i]插入位置j后,a[1:i]仍为有序序列。
  • 进行n-1次操作,a[n]变成有序序列。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

核心代码:

void insertSort() {
   
	for(int i=2; i<=n; i++){
   
	// 1. find j that a[j-1] < a[i] < a[j]
		int  temp =a[i], j =i;		// 插入元素temp和插入位置j
		while(j >1 && temp <a[j-1]) {
   
			a[j] =a[j-1];
			j--;
		}
	// 2. let a[j] =a[j-1] and finally a[j] = a[i]
		a[j] = temp;
	}
}

1.3 sort排序

(1)头文件

# include 
using namespace std;

(2)参数
sort(首元素地址,尾元素地址的下一个地址,比较函数)

  • 尾元素地址的下一个地址也可以表示为:首元素地址 + 序列长度
  • sort函数默认为从小到大按升序排列

(3)实现cmp函数
比较int, double, char类型

// 升序排列
bool cmp(int a, int b) {
   
	return a > b;		// 返回a排在b前的条件
}

比较map的value值
map和dict容器不能使用sort进行排序,所以需要转换为vector进行排序

bool cmp(pair<int,int> &x, pair<int,int> &y)
{
   
// 按value值降序排列
	return x.second > y.second;
}


vector<pair<

你可能感兴趣的:(数据结构与算法,算法,数据结构,PTA)