leetcode刷题c++各类排序总结
写在前面:
对于数据结构和算法来说,排序是最基础的,也是初学时理解较为困难的,这里作以记录,便于我自己复习,也是更加深我自己的理解
1、冒泡排序
冒泡排序几乎是最先了解的排序算法,思想也很简单:
如果每次我们将相邻元素进行对比,并且把较大的元素交换(swap)到后面,那么通过一轮的相邻对比,数组最后的元素就是这个数组中最大的元素。
那么我们进行n轮对比,每次对前n个元素进行相邻比较和交换,那么最终就会得到一个有序的数组。
实现如下 :
void bubble(int *arr,int n) {
//冒泡排序
//每一趟比较后把这一趟找到的最大元素放到数组最后
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-1; j++) {
//注意j<n-1,小心溢出
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
这里我们经常会用到swap的动作,初学时一般使用这样的方法进行交换:
假如有两个int类型的变量a和b
int temp = a;
a = b;
b = temp;
所以,可以定义一个swap函数,方便后续的交换:
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
这里需要使用引用的方式将参数传入函数
int i;
int &j = i;
相当于说“j是i的一个别名”
声明引用的同时必须初始化‘&j = i’ 指向一个已经存在的对象
一旦一个引用被初始化,不能指向其他对象
复杂度:
对冒泡排序来说,平均时间复杂度:O(n2)
2、选择排序
选择算法的思想是:
每次找到这一趟中的最小数,放在数组的开头(位置是走的趟数)
第一趟找到所有n个元素中最小的,放在第一个元素
第二趟找到后n-1个元素中最小的,放在第二个元素
……
第n-1趟找到后两个元素中最小的,放在第n-1元素(倒数第二个)
第n趟找到最后一个元素中最小的,放在第n个元素(最后一个)
实现:
void select(int* arr, int n) {
//选择排序
//每一次找到当前的最小数,放在这次的位置,第一次放在第一个,第二次放在第二个……
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i; j < n; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min != i) {
swap(arr[i], arr[min]