hiho1128 非有序数组的二分查找 (快速排序)

链接:

hihocoder1128

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1000050];
int _sort(int left,int right)
{
    int x=a[left];
    while(left<right)
    {
        while(a[right]>x&&left<right)
            right--;
        if(left<right)
        {
            a[left]=a[right];
            left++;
        }
        while(a[left]<x&&left<right)
            left++;
        if(left<right)
        {
            a[right]=a[left];
            right--;
        }
    }
    a[left]=x;               //left==right
    return left;
}

int unsorted_binarysearch(int left,int right,int key)   //每次都选择起点作为“枢纽”
{
    if(left>right)
        return -1;

    int x=a[left];
    int mid_loc=_sort(left,right);

    if(x==key)
        return mid_loc;
    else if(x>key)
        unsorted_binarysearch(left,mid_loc-1,key);
    else
        unsorted_binarysearch(mid_loc+1,right,key);

}

int main()
{
//    freopen("in.txt","r",stdin);
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    cout<<unsorted_binarysearch(1,n,k)<<endl;
    return 0;
}
时间: 2024-08-27 23:21:04

hiho1128 非有序数组的二分查找 (快速排序)的相关文章

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列

有序数组的二分查找

二分查找的优点是比较次数少,查找速度快,但是在查找之前必须建立有序表.另外,二分查找只适用于顺序存储的有序表,而不适用于链接存储的有序表. 假设:给定一个按从小到大排序的数组P,对分查找某个元素的位置. 二分查找的过程为首先将x和数组的中间项进行比较,若x小于中间项的值,则在线性表的前半部分进行二分查找:若x大于中间项的值,则在线性表的后半部分进行二分查找:若x等于中间项的值,则查找结束.若待二分的子表长度为0时仍然没有找到这个元素,则说明数组中没有x. java代码 <span style=&qu

爪哇国新游记之二十七----数组的二分查找

代码: import java.util.ArrayList; import java.util.List; public class Bit { int max; int min; int[] arr; public Bit(int[] arrInput) { // 找出极值 for (int i = 0; i < arrInput.length; i++) { if (max < arrInput[i]) { max = arrInput[i]; } if (min > arrInp

二分查找 数组的二分查找

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 1083: 数组的二分查找 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1646  Solved: 641[Submit][Status][Web Board] Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output 一个整数(表示x的位置,若

【二分查找】无重复数组的二分查找(非递归版本)

// 二分查找法 #include <iostream> #include <vector> using namespace std; int BinarySearch(vector<int> vec,int target) { // 特殊输入 if(vec.size() <= 0) return -1; // 二分查找(非递归) int low = 0; int mid = 0; int high = vec.size()-1; // 注意:取等号 while(

[c/c++] programming之路(15)、多维数组和二分查找法,小外挂

一.多维数组 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int num[3][4]; 6 int i,j; 7 for (i = 0; i < 3; i++) 8 { 9 for (j = 0; j < 4; j++) 10 { 11 num[i][j]=4*i+j+1; 12 printf("%-3d",num[i][j]); 13 } 14 printf("\

一维数组之二分查找

/**     * @param args     * @author wangxianpeng     * 工作原理  :     * 二分查找法 又称折半查找法 .将数组中间位置记录的关键字与查找的关键字进行比较,     * 如果两者相等 则查找成功: 否则利用中间位置记录将数组分成前,后两个子数组     * ,如果中间位置记录的关键字大于查找关键字,则进一步查找前面的子数组     * ,否则 进一步查找后面的子数组.重复以上的过程,直到找到或找不到为止.     *      * 步

插入元素到有序数组,二分搜索查找插入位置

当一个数组有序时,要向其中插入元素,可以先使用二分搜索查找其要插入的位置,位置确定后可以执行插入操作. 其中二分搜索的循环体如下(部分代码,具体见文章最后): while(low<=high){//循环条件 mid = (low+high)/2; if(a[mid]<val){ low = mid+1; }else if(a[mid]>val){ high = mid-1; }else{ insert(a,last,mid,val);//a[mid]==val,执行插入操作 return

旋转数组的二分查找

问题描述:已知有序数组a[N], 从中间某个位置k(k未知,k=-1表示整个数组有序)分开,然后将前后两部分互换,得到新的数组,在该新数组的查找元素x.如:a[]={1,2,5,7,9,10,15},从k=4分开,得到新数组a={9,10,15, 1,2,5,7}. 1 #include "stdafx.h" 2 3 int search(int *a, int key, int low, int high) 4 { 5 if (low > high) 6 return -1;