C++版:冒泡,选择,插入排序,判断回文数字,判断数组中是否有超过一半次数的数字。

最近复习面经刷题准备以后秋招,复习一些经典的东西准备写一下博客记录一下,今天记录一下
7大排序中的几个排序
判断回文数,
还有判断一个数组中出现次数超过一半的数字

首先是冒泡排序,通过每个相邻的不断比较,从尾比到头,最后得出有序数列

#include<iostream>
using namespace std;
void swap(int&a, int&b)//交换两个元素的值
{
	int temp = a;
	a = b;
	b = temp;
}
void quickSort(int arr[], int arr_length)
{

	for (int i = 0; i < arr_length; i++)
	{
		for (int j = arr_length - 1; j >= i; j--)
		{
			if (arr[i] > arr[j])
			{
				swap(arr[i], arr[j]);//引用传递
			}
		}
	}
}

int main()
{
	int arr[6] = { 22,11,44,33,77,66 };
	//求出arr的长度,由于数组开辟时长度必须大于0,暂时不考虑空数组问题
	int length = sizeof(arr) / sizeof(arr[0]);
	quickSort(arr, length);
	cout << "排序后:";
	for (int i =0; i < length; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

选择排序:就是每次比的时候都选出来当前循环最小的那个值,然后跟当前的i互换

#include<iostream>
using namespace std;
void swap(int&a, int&b)
{
	int temp = a;
	a = b;
	b = temp;
}
void selectSort(int arr[], int arr_length)
{
	for (int i = 0; i < arr_length; i++)
	{
		int min = i;
		for (int j = i + 1; j < arr_length; j++)
		{
			if (arr[min] > arr[j])//不断比较得出当前一趟最小的值
			{
				min =j;
			}
		}
		if (i != min)
		{
			swap(arr[i], arr[min]);
		}
	}
	
}

int main()
{
	int arr[4] = { 22,11,44,33};
	//求出arr的长度,由于数组开辟时长度必须大于0,暂时不考虑空数组问题
	int length = sizeof(arr) / sizeof(arr[0]);
	
	selectSort(arr, length);

	cout << "排序后:";
	for (int i =0; i < length; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

插入排序:通过分解数列,把每个j元素当作一个新的值,每次插入进来。插入到合适的位置

#include<iostream>
using namespace std;
void swap(int&a, int&b)
{
	int temp = a;
	a = b;
	b = temp;
}
void insertSort(int arr[], int arr_length)
{
	int i, j, k;

	for (i = 1; i < arr_length; i++)
	{
		//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
		for (j = i - 1; j >= 0; j--)
			if (arr[j] < arr[i])
				break;

		//如找到了一个合适的位置
		if (j != i - 1)
		{
			//将比a[i]大的数据向后移
			int temp = arr[i];
			for (k = i - 1; k > j; k--)
				arr[k + 1] = arr[k];
			//将a[i]放到正确位置上
			arr[k + 1] = temp;
		}
	}
	
}

int main()
{
	int arr[4] = { 22,11,44,33};
	//求出arr的长度,由于数组开辟时长度必须大于0,暂时不考虑空数组问题
	int length = sizeof(arr) / sizeof(arr[0]);
	
	insertSort(arr, length);

	cout << "排序后:";
	for (int i =0; i < length; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}
判断一个数是否为回文数,有这样一类数字,他们顺着看和倒着看是相同的数,例如:1111,1221,2332等,这样的数字就称为:回文数字。	就是i循环一半,判断前后是否相等就行了
#include<iostream>
using namespace std;
void Palindrome(const char*str)
{

	int mid = strlen(str);
	for (int i = 0; i < mid / 2; i++)
	{
		if (str[i] == str[mid - 1-i])
		{
			continue;
		}
		else
		{
			cout << "no" <<endl;
			return;
		}
	}
	cout << "yes" << endl;
}
int main()
{
	const char*str1 = "noon";
	const char*str2 = "str1";
	Palindrome(str1);
	Palindrome(str2);

	return 0;
}

判断一个数在数组中是否出现超过一半的次数,例如[0,0,0,2,3],0出现了三次,所以是0

#include<iostream>
#include<map>
using namespace std;
int total(int arr[],int length)
{
	map<int, int> item;
	for (int i = 0; i < length; i++)
	{
		item[arr[i]]++;//用map把数值当作key,出现的次数当作value
	}
	for (int i = 0; i < length; i++)
	{
		if (item[arr[i]] > length / 2)//统计这个数的次数是否大于一半
		{
			return arr[i];
		}
	}
	return -1;
}
int main()
{
	int arr[5] = { 1,1,2,2,2 };
	int length = sizeof(arr) / sizeof(arr[0]);

	int num = total(arr, length);
	if (num != -1)
	{
		cout << num <<endl;
	}
	else
	{
		cout << "没有超过一半次数的数字" << endl;
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值