[算法] 循环有序数组查找非递归实现

非递归实现

#include<stdio.h>#include<stdlib.h>

int isOrdered(int *array, int begin, int end) {
    return *(array+end) > *(array+begin) ? 1 : 0;
}

int contains(int *array, int begin, int end, int theNum) {
    return theNum >= *(array + begin) && theNum <= *(array + end) ? 1 : 0;
}

int CyclicOrderedBinarySearchNonRecursively(int *array, int begin, int end, int theNum) {

    while(end >= begin) {
        if(begin == end) {
            if(*(array + begin) == theNum) {
                return begin;
            } else {
                return -1;
            }
        }

        int mid = (begin + end) / 2;
        if(isOrdered(array, begin, mid)) {
            if(contains(array, begin, mid, theNum)) {
                end = mid;
            } else {
                begin = mid + 1;
            }

        } else {
            if(contains(array, mid + 1, end, theNum)) {
                begin = mid + 1;
            } else {
                end = mid;
            }
        }
    }
    return -1;
}

int search_nonrecursively(int *array, int n, int theNum) {
    return CyclicOrderedBinarySearchNonRecursively(array, 0, n - 1, theNum);
}

int main() {

    int *array = (int *)malloc(sizeof(int)*16);
    int i;
    for(i = 0; i < 16; i++) {
        *(array + i) = (i+5) % 16;
    }

    int ret = search_nonrecursively(array, 16, 10);
    printf("%d\n", ret);
    return 0;
}
时间: 2024-08-03 23:34:55

[算法] 循环有序数组查找非递归实现的相关文章

[算法] 循环有序数组查找

有序数组二分查找的变形,代码如下: #include<stdio.h> #include<stdlib.h> int main() { int *array = (int *)malloc(sizeof(int)*16); int i; for(i = 0; i < 16; i++) { *(array + i) = (i+5) % 16; } int ret = search(array, 16, 10); printf("%d", ret); retu

KT学算法(二)——循环有序数组查找指定元素

问题描述 一个循环有序的数组是形如:"12,16,18,20,41,100,1,4,6,9" 这样的数组. 问题分析 对于循环有序数组,一种简单的定义是: 循环有序数组是将一个有序数组切成两段,并交换位置得到引用块内容 比如现将1,4,6,9,12,16,18,20,41,100在9和12处切分,得到两段:1,4,6,9和12,16,18,20,41,100,再交换这两段的位置就得到了一开始的循环有序数组. 另一种比较严格的定义是: 对于一个循环有序数组{A1,A2,--An},存在一

循环有序数组,查找值

一.从一个循环有序数组总查找给定值 1.思路:先通过中间值和最后一个或者第一个元素比较,找出局部有序范围,再通过二分查找局部有序段 private static int sortArrFindOne(int arr[], int low, int high, int target) { int mid = (high - low) / 2 + low; if (arr[mid] == target) return mid; if (arr[mid] < arr[high]) { if (arr[

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

leetcode——Search a 2D Matrix 二维有序数组查找(AC)

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right. The first integer of each row is greater than the last integer of the previous ro

算法—8.有序数组中的二分查找

1.具体算法 /** * 算法3.2 二分查找(基于有序数组) * Created by huazhou on 2015/11/29. */ public class BinarySearchST<Key extends Comparable<key>, Value> { private Key[] keys; private Value[] vals; private int N; public BinarySearchST(int capacity){ keys = (Key[

数据结构和算法学习六,之非递归排序

http://blog.csdn.net/feixiaoxing/article/details/6844826 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主

自己写算法---java的堆的非递归遍历

import java.io.*; import java.util.*; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); //ArrayList<String> list = new ArrayList<String>(); //Scanner scan = new Scanner(System.in); //获取键盘输入的另一种格

一步两步学算法之树的遍历 非递归实现

递归的程序其实我觉得可读性较高  但是执行效率低下 为了做一道PAT的题 去理解了下非递归实现树的遍历 用一个栈来实现 先序遍历 先访问节点 再把节点push进栈 再访问 再push 直到next=NULL 然后pop出一个节点 也就是弹出一个节点 访问它的右边 再弹出 在访问 中序遍历 把左边节点全部push进栈 然后弹出 访问中间 再访问右边  再弹出 一直循环 后序遍历 比较难理解  要入两次栈才能访问 先左边全部入栈  栈顶是左边的元素 此书不能访问 因为右边还没入栈 下面给出先序和后序