C++算法3

本文深入探讨了C++中的几种关键算法和数据结构应用,包括数组排序后的最大差值计算、容器与迭代器的高效使用、洗牌算法的实现,以及二分查找的递归与非递归方法。通过具体示例展示了C++标准库函数的运用,如sort、random_shuffle及内置的swap函数,同时提供了实用的代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int maximumGap(vector<int> &nums)
{
	int i, j;
	int len = nums.size();
	if (len < 2)
		return 0;
	else
	{
		for (i = 1; i < len; i++)      //冒泡排序
		{
			for (j = len - 2; j >= i; j--)
			{
				if (nums[j]>nums[j + 1])
				{
					swap(nums[j], nums[j + 1]); //采用C++内置函数交换两数位置
					/*int temp;
					temp = nums[j + 1];
					nums[j + 1] = nums[j];
					nums[j] = temp;*/
				}
			}
		}
		//sort(nums.begin(),nums.end());  //采用C++内置函数排序
		int  diff, max_diff = 0;
		for (int i = 0; i < len - 1; i++)
		{
			diff = nums[i + 1] - nums[i];
			if (diff>max_diff)
				max_diff = diff;
		}
		return max_diff;
	}
}
	
int main()
{
	vector<int> nums = { 1, 11, 8, 100, 6, 3, 2, 35, 7 };
	cout << maximumGap(nums) << endl;
	return 0;
}


2、巧用C++当中的容器,迭代器以及自带函数

#include <iostream>
#include<vector>
#include<algorithm> //sort函数头文件
using namespace std;

	
int main()
{
	vector<int> nums;
	int n = 5;
	while (n--)
	{
		int score;
		cin >> score;
		nums.push_back(score);
	}
	sort(nums.begin(), nums.end());
	for (auto it = nums.begin(); it != nums.end(); ++it)
		cout << *it << endl;
	return 0;
}

3、洗牌算法

方法一:使用algorithm库函数中的random_shuffle()函数

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define CARDS_COUNT 54
int main()
{
	vector<int> s_stl;
	for (int i = 0; i < CARDS_COUNT; ++i)
		s_stl.push_back(i);
	random_shuffle(s_stl.begin(), s_stl.end());
	cout << "使用C++算法库:" << endl;
	//for (vector<int>::iterator it = s_stl.begin(); it != s_stl.end(); it++)
	for (auto it = s_stl.begin(); it != s_stl.end(); it++)
		cout << " " << *it;
	return 0;
}

 方法二:全局洗牌法

    a)首先生成一个数组,大小为54,初始化为1~54

    b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 value = rand %54,那么我们的索引牌就和这个余数牌进行交换处理

    c)等多索引到54结束后,一副牌就洗好了

    代码如下所示:

#include<iostream>
#include<vector>
#include<algorithm>
#include<time.h>  //time函数头文件
#include<stdlib.h>//srand()函数头文件
using namespace std;
#define CARDS_COUNT 54

void get_rand_number(vector<int> &array, int length)
{
	int index;
	int value;
	int median;

	//if (NULL == array || 0 == length)
	if (array.empty() || 0 == length)
		return;
	srand((int)time(0));//利用系统的时间作为生成随机数的种子
	/* 每次发牌的时候任意分配待交换的数据 */
	for (index = 0; index < length; index++)
	{
		value = rand() % length;

		median = array[index];
		array[index] = array[value];
		array[value] = median;
	}
}

int main()
{
	vector<int> s_stl;
	for (int i = 0; i < CARDS_COUNT; ++i)
		s_stl.push_back(i);

	get_rand_number(s_stl, CARDS_COUNT);

	for (auto it = s_stl.begin(); it != s_stl.end(); it++)
		cout << " " << *it;
	return 0;
}

4、二分查找实现(递归和非递归两种方法)

#include<iostream>
using namespace std;

int BinarySearch(int *array, int aSize, int key)//非递归查找
{
	if (array == NULL || aSize <= 0)
		return -1;
	int low, high, mid;
	low = 0;
	high = aSize-1;
	while (low<=high)
	{
		mid = (low + high) / 2;
		if (array[mid] == key)
			return mid;
		else if (array[mid] > key)
			high = mid-1;
		else
			low = mid+1;
	}
	return -1;
}

int BinarySearchRecursive(int *array, int low, int high, int key)//递归
{
	if (low > high)
		return -1;

	int mid = (low + high) / 2;
	if (array[mid] == key)
		return mid;
	else if (array[mid] > key)
		BinarySearchRecursive(array, low, mid - 1, key);
		
	else
		BinarySearchRecursive(array, mid + 1, high, key);
	
}
int main()
{
	int array[10] = {0};

	for (int i = 0; i < 10; i++)
		array[i] = i;

	//cout << "No recursive:" << endl;
	//cout << "position:" << BinarySearch(array,10,11)<< endl;
	cout << "Recursive:" << endl;
	cout << "position:" << BinarySearchRecursive(array, 0, 9, 11) << endl;
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值