七日算法先导(三)—— 冒泡排序,选择排序

举报
秋名山码民 发表于 2022/08/03 18:00:14 2022/08/03
【摘要】 作业解答俩数之和||class Solution { public int[] twoSum(int[] numbers, int target) { //递减,满足相加之和为target for (int i = 0, j = numbers.length - 1; i < j;) { int sum = numbers[i] + ...

作业解答

俩数之和||

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        //递减,满足相加之和为target
        for (int i = 0, j = numbers.length - 1; i < j;) {
            int sum = numbers[i] + numbers[j];
            if (sum == target) return new int[] {i + 1, j + 1};
            else if (sum > target) j--;//大了,向左移动
            else i++;//小了,向右移动
        }
        return null;
    }
}

双调队列

#include<iostream>
using namespace std;
int n,a[1001];
int main()
{
    cin>>n;//输入 
    for(int i=1;i<=n;i++)cin>>a[i];//和输入 
    sort(a+1,a+n+1);//和排序 
    for(int i=1;i<=n/2;i++)
    {
        cout<<a[n-i+1]<<endl<<a[i]<<endl;//和输出 
    }
    if(n%2)cout<<a[n/2+1]<<endl;//和判定 
}

概念

排序,不同的算法书,有不同的解答,有的叫10大排序,有的叫8大排序,我们是按照十个来讲,
具体可以看下面这篇我早期写的文章:10大排序

冒泡排序

请添加图片描述思想:
俩俩比较,如果反序交换,直到没有反序的记录为止,代码实现比较简单,是俩个for循环的嵌套

#include<iostream>
#include<algorithm>//调用算法库,使用交换函数swap
#include<cstdio>
using namespace std;
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		cin >> a[i];

	}
	for (int i = 0; i < 10; i++)
	{
		for (int j = i + 1; j < 10; j++)
		{
			if (a[i] < a[j])
				swap(a[i], a[j]);
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

时间复杂度为O(n^2)

选择排序

请添加图片描述
我们发现,从第一个元素最后一个元素中选择出一个最小的元素,和第一个元素进行交换,然后,从第二个元素到最后一个元素中选择出最小的元素,和第二个元素进行交换,最后,一定可以保证所有元素都是升序排列的

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		cin >> a[i];
	}
	for (int i = 0; i < 10; i++)
	{
		int min = i;
		for (int j = i + 1; j < 10; j++)
		{
			if (a[min] > a[j])
				min = j;//交换下标位置
		}
		if (i != min)
			swap(a[i], a[min]);
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

刷题巩固

有序数组的平方
数组中最大书对和的最小值

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。