leetcode刷题c++各类排序总结

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]
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用中的代码片段是一个递归函数,名为beautifulArray,它接受一个整数n作为参数,并返回一个vector<int>类型的结果。这个函数用于生成一个长度为n的漂亮数组,漂亮数组满足以下条件:如果将其划分为两个任意长度的子数组,那么两个子数组的元素之和不相等。 函数的实现思路是通过递归,将问划分为两个子问,然后合并子问的解。首先判断n是否等于1,如果等于1,则直接返回一个包含1的数组。否则,将n减1后的一半传入递归函数beautifulArray,得到一个漂亮数组res1。然后将n的一半传入递归函数beautifulArray,得到另一个漂亮数组res2。最后,将res1中的每个元素乘以2并减去1,然后与res2中的每个元素乘以2合并到结果数组res中。 引用中的代码片段是一个函数,名为translateNum,它接受一个整数num作为参数,并返回一个整数。这个函数用于计算将整数num翻译成字符串的不同方法数。 函数的实现思路是将整数num转换为字符串str,然后创建一个长度为str.size()-1的动态数组dp,用于记录不同位置的翻译方法数。然后初始化dp和dp[1]为1,表示前两位数字的翻译方法数。接下来,从第三位数字开始遍历字符串str,如果当前数字与前两位数字可以构成一个在10到25之间的整数,则将dp[i]的值设置为dp[i-1]+dp[i-2],表示当前位置的翻译方法数为前一位和前两位数字的翻译方法数之和。最后,返回dp最后一个元素的值,即为翻译整数num的不同方法数。 引用中的代码片段是一个函数,名为numberOfArithmeticSlices,它接受一个vector<int>类型的数组nums作为参数,并返回一个整数。这个函数用于计算数组nums中等差子序列的个数。 函数的实现思路是通过动态规划,创建一个与nums长度相同的动态数组dp,用于记录以每个位置为结尾的等差子序列的个数。然后遍历数组nums,从第三个元素开始,判断当前元素与前两个元素是否构成等差数列,如果是,则将dp[i]的值设置为dp[i-1]加1,表示以当前位置为结尾的等差子序列个数为前一位的等差子序列个数加1。最后,返回dp数组中所有元素的和,即为等差子序列的个数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值