题目:给定一个含n(n≥1)个整数的数组,请设计一个算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。
思路:1)建立数组b,将数组a复制到数组b中
2)对数组b进行排序,排序后扫描数组b,第一次未出现的正整数即为所求。
#include <stdio.h>
int partition(int b[],int low,int high){ //快速排序中对数组进行一次划分
int pivot =b[low];
while(low<high){
while(low<high&&b[high]>=pivot)
high--;
b[low]=b[high];
while(low<high&&b[low]<=pivot)
low++;
b[high]=b[low];
}
b[low]=pivot;
return low;
}
void QuickSort(int b[],int low,int high){ //快速排序
int pivotpos;
if(low<high){
pivotpos= partition(b,low,high);
QuickSort(b,low,pivotpos-1);
QuickSort(b,pivotpos+1,high);
}
}
int Search_non_int(int a[],int n){ //找数组中未出现的最小正整数
int b[n];
int non=1;
for(int i=0;i<n;i++)
b[i]=a[i];
QuickSort(b,0,n-1);
for(int i=0;i<n;i++)
{
if(b[i]>0)
{
if(b[i]==non)
non++;
else return non;
}
}
return non;
}
int main(){
int n=3;
int a[3]={1,2,3};
printf("数组为:");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n数组中未出现最小整数为:%d", Search_non_int(a,n));
}
运行结果:
由于运用的是快速排序,算法的时间复杂度为O(nlog2n),空间复杂度O(n)。