【解题报告】《算法零基础100讲》(第33讲) 排序入门 - 冒泡排序

python冒泡排序算法非递归_python 冒泡排序,递归 今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,11,12,13. 代码: class Solution: def __init__(self): self.key = '1' self.result = 0 def countDigitOne(se... 阅读详情

前言

美好的一天从排序开始

原文链接:《算法零基础100讲》(第33讲) 排序入门 - 冒泡排序

不要看这一文章是冒泡排序,按自己想法来做就好。

冒泡排序原理

两两相比较,大的向后挪,一轮走完后,最后一个元素就是最大的;依靠这一特性,每一轮找待排序序列的最大值,放到最后。

在这里插入图片描述

实现

void Bubble_Sort(int* arr, int len)
{
	assert(arr != NULL);

	bool flag = true;

	for (int i = 0; i < len - 1; ++i)
	{
		flag = true;
		for (int j = 0; j < len - 1 - i; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = false;
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;	
			}
		}
		if (flag)
		{
			break;
		}
	}
}

75. 颜色分类

原题链接:75. 颜色分类

在这里插入图片描述

法一:冒泡排序

class Solution {
public:
    void sortColors(vector<int>& nums)
    {
        int numSize = nums.size();
        bool flag = true;

        for (int i = 0; i < numSize - 1; ++i)
        {
            flag = true;
            for (int j = 0; j < numSize - i - 1; ++j)
            {
                if (nums[j] > nums[j + 1])
                {
                    flag = false;
                    swap(nums[j], nums[j + 1]);
                }
            }
            if (flag)
            {
                break;
            }
        }    
    }
};

法2:首尾双指针

定义两个指针,一个指向头,针对数字0;一个指向尾,针对数字2。

利用下标 i 遍历一遍,若遇到2,则与尾指针对应的数据交换 并将尾指针往前移一格,这里要写成循环,因为交换前尾指针对应的数据本来就是2;

若遇到0,则将他与头指针(0)对应的数据交换,并将头指针往后移;;

class Solution {
public:
    void sortColors(vector<int>& nums)
    {
        int n = nums.size();
        if (n <= 0)
            return ;

        int p0 = 0, p2 = n - 1;

        for (int i = 0; i < n; ++i)
        {
            while (i <= p2 && nums[i] == 2)
            {
                swap(nums[i], nums[p2--]);
            }

            if (nums[i] == 0)
            {
                swap(nums[i], nums[p0++]);
            }
        }    
    }
};

4. 寻找两个正序数组的中位数

原题链接:4. 寻找两个正序数组的中位数

在这里插入图片描述

在这里插入图片描述

代码

将两个数组合并为一个数组,然后冒泡排序,取中位数

这里不写冒泡了,直接用的C++的STL,因为是困难题,对时间复杂度有要求,这个题可以收藏,以后练排序用。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
    {        
        nums1.insert(nums1.end(), nums2.begin(), nums2.end());
        
        sort(nums1.begin(), nums1.end());
        int n = nums1.size();

        return (n % 2 != 0) ? nums1[n / 2] : (nums1[n / 2] + nums1[n / 2 - 1]) / 2.0;
    }
};

747. 至少是其他数字两倍的最大数

原题链接:747. 至少是其他数字两倍的最大数

在这里插入图片描述

分析

声明两个变量分别代表最大值和第二大的值;

遍历一遍,如果遇到比最大值大的,则顺位更新,遇到比第二大值大的,赋值给第二大;

最后比较最大值和第二大值的关系。。

代码

class Solution {
public:
    int dominantIndex(vector<int>& nums)
    {
        const int ERR = -1;
        int n = nums.size();
        if (n == 0)
            return -1;
        
        int max = -1, second = -1;
        int index = 0;

        for (int i = 0; i < n; ++i)
        {
            if (nums[i] > max)
            {
                second = max;
                max = nums[i];
                index = i;
            }
            else if (nums[i] > second)
            {
                second = nums[i];
            }
        }

        return (second * 2 <= max) ? index : ERR;
    }
};
算法入门第一篇 1、给定一组“无序”记录序列{25, 30, 11, 7, 22, 16, 18, 33, 40, 55},采用冒泡排序、堆排序、直接选择排序以及直接插入排序,将该序列排成非递减序列,完成以下问题: 1)写出冒泡排序、堆排序、直接选择排序和直接插入排序的Java实现代码。 2)采用上述4种方进行排序时,都要执行的两种基本操作是什么? 3)写出冒泡排序第二趟排序后的... 阅读详情

相关推荐

算法零基础100(33) 排序入门 - 冒泡排序

排序入门冒泡排序

英雄哪里出来 7384

7-3 冒泡排序 (10)

将N个整数按从小到大排序冒泡排序是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。 本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。 输入格式: 输入在第1行中给出N和K(1≤K&lt...

weixin_46281707的博客 3343

练习-冒泡排序

第n-1步:如果 a[n-2]>a[n-1],a[n-2]和a[n-1]交换,a[n-1]是n个数组元素中最大者。a[1]=a[2];第1步:如果 a[0]>a[1],a[0]和a[1]交换,a[1]是a[0]、a[1]中的大者。1)如果 a[0]>a[1],a[0]和a[1]交换,a[1]是a[0]、a[1]中的大者。第2步:如果 a[1]>a[2],a[1]和a[2]交换,a[2]是前三个数组元素中最大者。2)如果 a[1]>a[2],a[1]和a[2]交换,a[2]是三者中最大者。

Junds0的博客 973

7-27 冒泡排序 (20)

将N个整数按从小到大排序冒泡排序是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。 本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。 输入格式: 输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格隔。 输出格式: 在一行中输出冒泡排序扫描完第K

GJINW的博客 5980

7-7 冒泡排序 (20)

7-7 冒泡排序 (20) 将N个整数按从小到大排序冒泡排序是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。 本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。 输入格式: 输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格隔。 输出格式:

xiahuayong的博客 3449

pta冒泡排序c语言_PTA7-30 字符串的冒泡排序(20 )通俗雙解

我們已經知道了將N個整數按從小到大排序冒泡排序。本題要求將此方用於字符串序列,並對任意給定的K(輸入格式:輸入在第1行中給出N和K(1≤K輸出格式:輸出冒泡排序掃描完第K遍后的中間結果序列,每行包含一個字符串。輸入樣例:6 2bestcateastafreeday輸出樣例:bestacatdayeastfree這道題為什么有20?一方面是涉及排序算法,另一方面估計是考察你在不用函數庫提供...

weixin_39580682的博客 890

[解题报告]《算法零基础100(33) 排序入门 - 冒泡排序

零、写在前面 今天是打卡的第33天,今天的难度巨低,难道因为大家都要考试了?知识点在:《算法零基础100(33) 排序入门 - 冒泡排序https://blog.csdn.net/WhereIsHeroFrom/article/details/121463964 一、主要知识点 1.冒泡排序 每次将最大的元素冒到最后,那么最后几个元素就是局部有序的。 需要注意的是交换的时候进行标记,如果一趟冒泡里没有发生任何一次交换,说明已经有序,可以提前退出。 #...

XingleiGao的博客 623

(33) 排序入门 - 冒泡排序解题报告

75. 颜色- 力扣(LeetCode(leetcode-cn.com)https://leetcode-cn.com/problems/sort-colors/颜色类其实就是排序,下面我将使用c,和c++两种语言解题 //c void Swap(int *a, int *b) {//定义一个交换变量的函数 *a=*a^*b;//异或的方 *b=*a^*b; *a=*a^*b; } void BubbleSort(int n, int *a) { //简单的冒泡

m0_61723200的博客 989

[题解]《算法零基础100(33) 排序入门 - 冒泡排序

文章目录一. 冒泡排序二. 相关练习2.1 颜色类2.2 寻找两个正序数组的中位数2.3 至少是其他数字两倍的最大数 一. 冒泡排序   冒泡排序的原理就和从水底的冒上来的气泡一样,气泡越大,其排开的水体积就越大,上浮的也就越快,所以一般上面的气泡会比下面的气泡要大(当然气泡上升过程中不断变大是因为水压减小的缘故),而冒泡排序的形式也是差不多的,如果是进行升序排序的话,就是将较大的数据往右边移动,每次循环都会将一个最大的数据排到最右边。 例图: 所以经过多轮排序后,整个数组就排成了一个升序的形式。 代

qq_53060585的博客 681

轻松掌握冒泡排序:Python冒泡排序算法

冒泡排序通常是程序员面试中经常被考察的八大排序算法之一。 初级开发岗位的面试基本上都被会问到,原因:

程序员小芽的博客 685

Python算法冒泡排序和选择排序

Python算法冒泡排序和选择排序冒泡排序:重复地走访过要排序的元素列,依次比较两个相邻的元素,一层一层的将较大的元素往后移动,类似气泡慢慢变大的过程。 算法思想:1.从第一个和第二个开始比较,如果第一个比第二个大,则交换位置;然后比较第二个和第三个,依次类推; 2.经过第一轮循环,最大的数已经排在最后一位,所以重复以上操作,第二大的数会排在倒数第二个位置。 3.则再重复n-1次排序完毕,因...

虎口脱险的博客 548

() 数据结构 - 冒泡排序

冒泡排序 冒泡排序是一种简单的排序算法。该排序算法是基于比较的算法,其中比较每对相邻元素,如果元素不按顺序交换。该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度为Ο(n^2),其中n是项数。 核心思想 我们以未排序的数组为例。冒泡排序需要Ο(n^2)的时间,因此我们将其简短而精确。 冒泡排序从头两个元素开始,然后比较它们以检查哪个更大。 在这种情况下,值33大于14,...

数据工匠记 4310

java冒泡排序算法

import java.util.Random; public class Test1 { public static void main(String[] args) { int[] list=new int[50]; int temp=0; Random random=new Random(); for(int j=0;j<list.length;j++) l...

qq_38883271的博客 445

冒泡排序和选择排序--C语言

根据上述过程,我们可以发现,我们每一遍遍历过程都会有一个最大的数冒出来,并且我们下一遍遍历就不需要管这一遍冒出来的数了冒泡排序和选择排序都是简单排序,时间复杂度都是O(n^2),但冒泡排序是相邻的两个交换,所以它稳定,而选择排序是最小的值与待排序的第一个值交换,并不一定相邻,所以不稳定。

weixin_75188368的博客 1447

JAVA数据结构和算法-简单排序冒泡排序

解析 冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。 使用冒泡排序算法对棒球队员排序 如果人近视的像计算机一样,以至于只能看到站在他面前的两个相邻的棒球队员。在这种困难的情况下,如何为队员们进行排序呢?假设有N个队员,并且根据所占的位置从左到右别给每个队员编号,从0到N-1。 冒泡排序程序执行如下:从队列的最左边开始,比较0号位置和1号位置的队员。如果左边的队员(0号)高,就让两个队员交换。如果右边的队员高,就什么也不做。然后右移一

不吃_花椒的博客 287

基本排序算法冒泡排序

在计算机世界里,排序就是把一组杂乱的数据按照升序或者降序重新编排每个数据的位置的过程。由于冒泡排序算法的核心是交换数据的位置,通过比较两个相邻的数据之间的大小,不断的把数值大的数据移动至数据队列的后面(升序排列),这个过程十类似于一个泡泡从水底里慢慢往上升起来的情形,算法由此得名。

volunteer01的专栏 908

《Java数据结构与算法》第3章——简单排序算法——冒泡排序、选择排序、插入排序

(1)冒泡排序 package thirdchapter; class ArrayBub { private long[] a; private int nElems; public ArrayBub(int max) { a = new long[max]; nElems = 0; } public void insert(long value) { a[nE...

Jack 276
上一篇: Linux : 进程的复制 (fork)
下一篇: 【解题报告】《算法零基础100讲》(第36讲) 排序进阶 - 归并排序
_索伦
博客等级 码龄5年 467粉丝 278原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_索伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值