数据结构与算法学习(1)
一.选择排序
void Sort01(vector<int>& arr) {
int size = arr.size();
for (int i = 0; i < size; i++)
{
int minIndex = i;
for (int j = i + 1; j < size; j++)
{
if (arr[j] < arr[minIndex])
minIndex = j;
}
Swap(arr, i, minIndex);
}
}
二.冒泡排序
void Sort02(vector<int>& arr) {
int size = arr.size();
int pos = 0;
int k = size - 1;
for (int i = 0; i < size - 1; i++)
{
bool flag = false;
for (int j = 0; j < k; j++)
{
if (arr[j] > arr[j + 1]) {
Swap(arr, j, j + 1);
flag = true;
pos = j;
}
}
if (!flag)return;
k = pos;
}
}
三.插入排序
void Sort03(vector<int>& arr) {
int size = arr.size();
for (int i = 0; i < size - 1; i++)
{
for (int j = i + 1; j > 0 && arr[j] < arr[j - 1]; j--)
{
Swap(arr, j, j - 1);
}
}
}
四.异或操作符
异或(^)的法则为,相同为0,不同为1
按位与运算符(&)的法则为,同为 1 的位,结果为 1,否则结果为 0
按位或运算符(|)的法则为,只要有1个是1的位,结果为1,否则为0
1.不用临时变量实现交换(非同一索引的数)
void Swap01(vector<int>& arr, int left, int right) {
arr[left] = arr[left] ^ arr[right];
arr[right] = arr[left] ^ arr[right];
arr[left] = arr[left] ^ arr[right];
}
2.一种数出现奇数次,其余数出现偶数次,找到这个数
void Test01(vector<int>& arr) {
int num = 0;
for (int i = 0; i < arr.size(); i++)
{
num ^= arr[i];
}
cout << num << endl;
}
3.两种数出现奇数次,其余数出现偶数次,找到这俩数
void Test02(vector<int>& arr) {
int eor1 = 0;
for (int i = 0; i < arr.size(); i++)
{
eor1 ^= arr[i];
}
//得到的结果为 两个奇数相异或的结果
//由于两个数不相同,到的结果不为零,说明两个数某一位其中一位为0另一位为1
int eor2 = 0;
int rightOne = eor1 & (~eor1 + 1);
for (int i = 0; i < arr.size(); i++)
{
if ((arr[i] & rightOne) == 0)
eor2 ^= arr[i];
}
cout << eor2 << " , " << (eor1 ^ eor2) << endl;
}
五.二分法
1.在一个有序数组中,找>=某个数最左侧位置
void Test03(vector<int>& arr, int num) {
int left = 0;
int right = arr.size() - 1;
int t = 0;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (arr[mid] >= num) {
right = mid - 1;
t = mid;
}
else {
left = mid + 1;
}
}
cout << t << endl;
}
2.局部最小值
void Test04(vector<int>& arr) {
if (arr[0] < arr[1]) {
cout << arr[0] << endl;
return;
}
if (arr[arr.size() - 2] > arr[arr.size() - 1]) {
cout << arr[arr.size() - 1] << endl;
return;
}
int left = 0;
int right = arr.size() - 1;
while (left < right)
{
int mid = left + ((right - left) >> 1);
if (arr[mid] > arr[mid - 1])
right = mid - 1;
else if (arr[mid] > arr[mid + 1])
left = mid + 1;
else {
cout << arr[mid] << endl;
return;
}
}
cout<<arr[left]<<endl;
}