void mySwap(int* pa, int* pb) {
* pa ^= *pb;// 异或
* pb ^= *pa;
* pa ^= *pb;
}
void selectSort(int* p, int n) {
int idx;
for (int i = 0; i < n - 1; i++) {
idx = i;
for (int j = i + 1; j < n; j++) {
if (p[i] < p[j])
idx = j;
}
if(idx != i)
mySwap(&p[i], &p[j]);
}
}
// 每次从零开始
void popSort(int* p, int n) {
int flag;
for (int i = 0; i < n - 1; i++) {
flag = 1;
for (int j = 0; j < n - 1 - i; j++) {
if (p[j] > p[j + 1])
{
mySwap(&p[j], &p[j + 1]);
flag = 0;// 表示当前外层循环有无序子串,因此发生了交换
}
}
if (flag)// 当当前循环从来没有发生交换时,说明子串已经有序
break;
}
}
void quickSort(int* p, int low, int high) {
if (low < high) {
int pivot = p[low];
int l = low, h = high;
while (l < h) {
while (p[h] >= pivot && l < h)// 大而移动,小而赋值。此处如果不加等号,
h--; // 当出现 9 1 2 3 9 这样的情况下,l和h均不作加减操作,出现死循环
p[l] = p[h];
while (p[l] <= pivot && l < h)// 小而移动,大而赋值.
l++;
p[h] = p[l];
}
p[l] = pivot;
quickSort(p, low, l - 1);
quickSort(p, l + 1, high);
}
}
int binarySearch(int* p, int low, int high, int find) {
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (find == p[mid])
return mid;
else if (find > p[mid])
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
int binarySearch_recursive(int* p, int low, int high, int find) {
int mid;
if (low <= high) {
mid = (low + high) / 2;
if (find == p[mid])
return mid;
else if (find > p[mid])
return binarySearch(p, mid + 1, high, find);
else
return binarySearch(p, low, mid-1, find);
}
return -1;
}
//大整数求平均值
int avg(int a , int b)
{
// 即,相同部分+(两者不同部分之和/2)
return (a&b + ((a^b)>>1))
}
一些常用算法整理
于 2021-07-06 18:16:08 首次发布