程序11-先升序后降序返回最大值

一个数列,先升序后降序,返回最大值的下标。

package org.fan.learn;

/**
 * Created by fan on 2016/10/10.
 */
public class BinarySearchMeituan {

    public static int search(int[] arr) {
        //特殊处理
        if (arr == null || arr.length == 0) {
            return -1;
        }

        int result = 0;
        int start = 0;
        int end = arr.length - 1;
        int mid = 0;
        //end-1防止只有两个数据  没有等于号防止只有1个数据
        while (start < end - 1) {
            mid = start + ((end - start) >>> 1);
            if (arr[mid] > arr[mid-1] && arr[mid] > arr[mid+1]) {
                return mid;
            }
            if (arr[mid] > arr[mid-1] && arr[mid] < arr[mid+1]) {
                start = mid+1;
            }
            if (arr[mid] < arr[mid-1] && arr[mid] > arr[mid+1]) {
                end = mid - 1;
            }
        }

        if (start == end) {
            result = start;
        }
        if (start < end) {
            result = arr[start] > arr[end] ? start : end;
        }

        return result;
    }

    public static void main(String[] args) {
        //6,7,8,9,4,5,6
        //9
        //6,7
        //6,5
        int[] arr = {4,6,5};
        System.out.println(search(arr));
    }
}

感觉用电脑写代码要比在纸上写代码爽多了,而且考虑的更周全;但是,面试时给个电脑,调试不出来怎么办?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
抱歉,我是一个自然语言处理模型,无法编写和运行代码。但是我可以提供以下伪代码供您参考: ```c #include <stdio.h> #include <stdlib.h> // 判断数组状态(0:未排序,1:升序,2:降序,3:升后降,4:降后升) int judge(int arr[], int n) { int i = 1; while (i < n && arr[i] == arr[i-1]) { i++; } // 未排序 if (i == n) { return 0; } // 升序 if (arr[i] > arr[i-1]) { while (i < n && arr[i] > arr[i-1]) { i++; } if (i == n) { return 1; } // 升后降 else { while (i < n && arr[i] < arr[i-1]) { i++; } if (i == n) { return 3; } } } // 降序 else { while (i < n && arr[i] < arr[i-1]) { i++; } if (i == n) { return 2; } // 降后升 else { while (i < n && arr[i] > arr[i-1]) { i++; } if (i == n) { return 4; } } } return -1; } // 顺序检索(返回元素下标,未找到返回-1) int seq_search(int arr[], int n, int x, int *cnt) { int i; for (i = 0; i < n; i++) { (*cnt)++; if (arr[i] == x) { return i; } } return -1; } // 二分检索(返回元素下标,未找到返回-1) int bin_search(int arr[], int l, int r, int x, int *cnt) { while (l <= r) { (*cnt)++; int mid = (l + r) / 2; if (arr[mid] == x) { return mid; } else if (arr[mid] > x) { r = mid - 1; } else { l = mid + 1; } } return -1; } // 三分检索(返回元素下标,未找到返回-1) int tri_search(int arr[], int l, int r, int x, int *cnt) { while (l <= r) { (*cnt)++; int m1 = l + (r - l) / 3; int m2 = r - (r - l) / 3; if (arr[m1] == x) { return m1; } else if (arr[m2] == x) { return m2; } else if (arr[m1] > x) { r = m1 - 1; } else if (arr[m2] < x) { l = m2 + 1; } else { l = m1 + 1; r = m2 - 1; } } return -1; } // 二分查找最大值(或最小值) int bin_max_min(int arr[], int n, int *cnt, int type) { int l = 0, r = n - 1; while (l <= r) { int mid = (l + r) / 2; (*cnt)++; if (type == 1) { // 查找最大值 if (arr[mid] > arr[mid+1]) { return arr[mid]; } else if (arr[mid] < arr[mid+1]) { l = mid + 1; } } else if (type == -1) { // 查找最小值 if (arr[mid] < arr[mid+1]) { return arr[mid]; } else if (arr[mid] > arr[mid+1]) { l = mid + 1; } } } return -1; } int main() { int n, choice, i, x, cnt = 0; printf("请输入数组长度n:"); scanf("%d", &n); int *arr = (int *)malloc(n * sizeof(int)); printf("请选择输入方式(1:人工输入,2:随机生成):"); scanf("%d", &choice); if (choice == 1) { printf("请输入%d个互不相同的整数:", n); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } } else if (choice == 2) { srand(time(NULL)); for (i = 0; i < n; i++) { arr[i] = rand() % (10*n); for (int j = 0; j < i; j++) { if (arr[j] == arr[i]) { i--; break; } } } } printf("数组状态为:%d\n", judge(arr, n)); printf("请输入要查找的元素:"); scanf("%d", &x); int idx = seq_search(arr, n, x, &cnt); if (idx != -1) { printf("顺序检索:元素%d在数组中,关键字比较次数为%d\n", x, cnt); } else { printf("顺序检索:元素%d不在数组中,关键字比较次数为%d\n", x, cnt); } cnt = 0; if (judge(arr, n) == 1 || judge(arr, n) == 2) { idx = bin_search(arr, 0, n-1, x, &cnt); if (idx != -1) { printf("二分检索:元素%d在数组中,关键字比较次数为%d\n", x, cnt); } else { printf("二分检索:元素%d不在数组中,关键字比较次数为%d\n", x, cnt); } } else { idx = tri_search(arr, 0, n-1, x, &cnt); if (idx != -1) { printf("三分检索:元素%d在数组中,关键字比较次数为%d\n", x, cnt); } else { printf("三分检索:元素%d不在数组中,关键字比较次数为%d\n", x, cnt); } } cnt = 0; if (judge(arr, n) == 1) { int max = bin_max_min(arr, n, &cnt, 1); printf("二分查找最大值:%d,关键字比较次数为%d\n", max, cnt); } else if (judge(arr, n) == 2) { int min = bin_max_min(arr, n, &cnt, -1); printf("二分查找最小值:%d,关键字比较次数为%d\n", min, cnt); } else if (judge(arr, n) == 3) { int max = bin_max_min(arr, n, &cnt, 1); int min = bin_max_min(arr, max+1, &cnt, -1); printf("二分查找最大值:%d,关键字比较次数为%d\n", max, cnt); cnt = 0; printf("二分查找最小值:%d,关键字比较次数为%d\n", min, cnt); } else if (judge(arr, n) == 4) { int min = bin_max_min(arr, n, &cnt, -1); int max = bin_max_min(arr, min+1, &cnt, 1); printf("二分查找最小值:%d,关键字比较次数为%d\n", min, cnt); cnt = 0; printf("二分查找最大值:%d,关键字比较次数为%d\n", max, cnt); } free(arr); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值