最近复习面经刷题准备以后秋招,复习一些经典的东西准备写一下博客记录一下,今天记录一下
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;
}