現在待查陣列不再是乙個單純的有序數列了,而是先把它在某個位置截為兩段,然後交換前後兩段的順序,形成新的數列。之後,再在這個新數列中進行查詢。
比如:我們有乙個原本的數列 [3, 5, 9, 7, 12, 15, 18, 32, 66, 78, 94, 103, 269],先把它截為兩段:[3, 5, 9, 7, 12, 15, 18, 32]和[66, 78, 94, 103, 269];然後把這兩個子數列前後交換,重新銜接成乙個新的數列: [66, 78, 94, 103, 269,3, 5, 9, 7, 12, 15, 18, 32];之後我們在新數列中查詢目標數。
套用經典二分查詢
旋轉數列當然也分為含重複數的,和不含重複數的。我們先來看看相對簡單一些的,沒有重複元素的情況。
無重複數旋轉數列的查詢,基本思想還是按照二分查詢那樣,整體是乙個迭代演算法,每次迭代都對應乙個待查區間。
每次迭代所面對的待查區間,實際上可能有下面三種情況:
上圖中的橘色線段表示乙個數字序列(雖然實際上我們的序列應該是分布在一條直線上的若干離散點,而且未必均勻分布,但是為了看得清楚,我們暫且用一條線段代替)。
【case-iii】是乙個完全的有序數列,而【case-i】和【case-ii】則是旋轉有序的數列。
假設整個旋轉數列是用arr表示的遞增序列的旋轉,low和high用
變形二分查詢
title 資料結構與演算法 專案 主題 二分查詢 description 分析 1 查詢的是乙個有序的資料集合 2 每次查詢都是與區間的中間元素進行對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為0 date 2021 version 0.1版本 author coff...
二分查詢及其變形
一 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。方法一 o n public int minnumberinrota...
二分查詢及其變形
最基本的二分查詢模版 在有序陣列a中查詢key,如果找到,返回位置索引,否則,返回 1 int binarysearch int a,int n,int key else if a mid key else return 1 變種1 如果a有多個key元素,返回最大的,否則,返回 1 int bin...