二分查找有很多变体,比如找“最后一个1”,“第一个1”等。
/*************************************************************************
> File Name: search.c
> Author: jby
> Mail:
> Created Time: Thu 20 Jul 2023 03:01:44 PM CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
// 二分查找
int binary_search(int *arr, int n, int x) {
int head = 0, tail = n - 1, mid;
while (head <= tail) {
mid = (head + tail) >> 1;
if (arr[mid] == x) {
return mid;
}
arr[mid] > x ? (tail = mid - 1) : (head = mid + 1);
}
return -1;
}
// 00000000000001111111111111111
int binary_search_first1(int *arr, int n) {
int head = 0, tail = n, mid;
while (head < tail) {
mid = (head + tail) >> 1;
if (arr[mid] == 1) {
tail = mid;
} else {
head = mid + 1;
}
}
return head == n ? -1 : head; // tail也可以
}
// 111111111111110000000000000000
int binary_search_last1(int *arr, int n) {
int head = -1, tail = n - 1, mid;
while (head < tail) {
mid = (head + tail + 1) >> 1; // 如果不加1,导致2+3/2=2会一直卡住
if (arr[mid] == 1) {
head = mid;
} else {
tail = mid - 1;
}
}
return head;
}
void insert_sort(int *arr, int n) {
int i, j;
for (i = 1; i < n; i++) {
for (j = i; j > 0 && arr[j] > arr[j - 1]; j--) {
arr[j] = arr[j] + arr[j - 1];
arr[j - 1] = arr[j] - arr[j - 1];
arr[j] = arr[j] - arr[j - 1];
}
}
return ;
}
void showArr(int *arr, int n) {
printf("arr:[");
int i;
for (i = 0; i < n; i++) {
i && printf(", ");
printf("%d", arr[i]);
}
printf("]\n");
}
int main () {
/*
char a = 120;
char b = 121;
a = a + b;
b = a - b;
a = a - b;
printf("a=%d, b=%d\n", a, b);// 这里实现了两级反转。溢出不影响交换结果
*/
srand(time(0));
#define N 10
int arr[N];
int i;
for (i = 0; i < N; i++) {
// arr[i] = 0;
// arr[i] = rand() % 100;
arr[i] = rand() % 2;
}
showArr(arr, N);
insert_sort(arr, N);
showArr(arr, N);
/*
int x;
while (~scanf("%d", &x)) {
printf("search %d at idx = %d\n", x, binary_search(arr, N, x));
}
*/
// printf("search first 1 at idx = %d\n", binary_search_first1(arr, N));
printf("search last 1 at idx = %d\n", binary_search_last1(arr, N));
#undef N
return 0;
}