找出数组中最小未出现元素(查找最小可用id)(无序数组)

//找出其中最小未出现元素
[0,3,9,8,19,10,6,4,1,7,2,5] 
//输出:10
int min_free(int arr[],int n);
#include<stdio.h>
#define SWAP(arr,i,j) {\
		unsigned tmp =arr[i];\
		arr[i] =arr[j];\
		arr[j]=tmp;\
}
//(找出数组中最小可用的ID
unsigned min_free(unsigned arr[], int n);


int main(void) {
	unsigned arr[] = {0,3,9,8,19,8,6,4,1,7,2,5};
	printf("%u\n",min_free(arr, 12));

	return 0;
}

//分区操作+二分查找 复杂度为O(n)数量级 
unsigned min_free(unsigned arr[], int n) {
	//[low,high]表示查找范围
	int low = 0;
	int high = n - 1;

	while (low<=high) {
		int mid = low + (high - low >> 1);
		
	//分区操作 l作为基准值  下面操作类似快排中partition部分 
		int l = low;
		for (int r = low; r < high + 1; ++r) {
			if (arr[r] <= mid) {
				SWAP(arr, l, r);
				++l;
			}
		}
		
		//二分查找
		if (l == mid + 1) {
			//在右半区间查找
			low = 1;
		}
		else { 
			//在左半区间查找
			high = l - 1;
		}

	}
	return low;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值