一些常用算法整理

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))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值