前段时间在捣鼓图像二值化的时候学到的算法(来源网页已经找不到了,,,汗),然后自己优化了一下(后面会再写一篇文章记录一下图像二值化的各种算法)。
#include
void max2index(int *arr, int n, int *first_idx, int *second_idx) {
//第 0 个最大数,第 1 个次大数
int max2idx[2] = { 0 ,-1};//考虑两个以上相同最大数,只取第一次匹配到的数
//int max2idx[2] = { 0 ,0};//如果不需要考虑有两个以上相同最大数
int i;
for(i = 1; i < n; ++i) {
//printf("%d,%d,%d,%d\n",i,arr[i],max2idx[0],max2idx[1]);
if(arr[i] > arr[max2idx[0]]) {
//如果比最大数还要大,则最大数取它,之前的最大数移入次大数
int t = max2idx[0];
max2idx[0] = i;
max2idx[1] = t;
} else if (arr[i] < arr[max2idx[0]]){
if (-1 == max2idx[1] || arr[i] > arr[max2idx[1]]) {
//如比最大数小:如次大数没有设置,则设为次大数;否则比次大数大才设为最大数
max2idx[1] = i;
}
}
}
*first_idx = max2idx[0];
if(max2idx[1] == -1) max2idx[1] = max2idx[0];//如果数组全是一样的数的情况,次大数则为没设置状态
*second_idx = max2idx[1];
}
void printarr(int *arr,int n) {
while(n-- > 1)printf("%d,",*(arr++));
printf("%d\n",*arr);
}
int main() {
int arr[] = {10,2,3,4,5,6,7,8,9,10};
//int arr[] = {1,1,1,1,1,1,1,1,1,1};
printarr(arr,10);
int first_idx,second_idx;
max2index(arr,10,&first;_idx,&second;_idx);
printf("first index:%d,second index:%d\n",first_idx,second_idx);
printf("first:%d,second:%d",arr[first_idx],arr[second_idx]);
}