二分法

二分法排序

谁都会走 提交于 2020-03-06 21:44:06
#include<stdio.h> #define MAXNUM 100 typedef int KeyType; typedef int DataType; typedef struct { KeyType key; /* 排序码字段 */ /*DataType info; 记录的其它字段 */ } RecordNode; typedef struct { int n; /* n为文件中的记录个数,n<MAXNUM */ RecordNode record[MAXNUM]; } SortObject; void binSort(SortObject * pvector) { /* 按递增序进行二分法插入排序 */ int i, j, left, mid, right; RecordNode temp; RecordNode *data = pvector->record; for( i = 1; i < pvector->n; i++ ) { temp = data[i]; left = 0; right = i-1; /* 置已排序区间的下、上界初值 */ while (left <= right) { mid = (left + right)/2; /* mid指向已排序区间的中间位置 */ if (temp.key < data[mid].key) right = mid

二分法排序

╄→гoц情女王★ 提交于 2020-03-06 21:42:45
class Program { static void Main(string[] args) { Console.WriteLine("请输入一个正序排列的整数数组,用空格分割,最后按回车键结束输入:"); string[] ValueStr = Console.ReadLine().Split(' '); Console.WriteLine("请输入要查询的数值:"); int value = int.Parse(Console.ReadLine().Trim()); int[] Items = new int[ValueStr.Length]; for (int i = 0; i < ValueStr.Length; i++) { Items[i] = int.Parse(ValueStr[i].Trim()); } Console.WriteLine("你要查询数值的位置为:" + binarySearch(Items, value).ToString()); Console.ReadLine(); } private static int binarySearch(int[] Items, int value) { if(Items.Length==1) { return 0; } int StartIndex = 0; int EndIndex = Items

排序—二分法插入排序

会有一股神秘感。 提交于 2020-03-06 21:41:41
思路和插入排序一样,可见: http://www.cnblogs.com/PerkinsZhu/p/5664808.html 不同点: 在寻找插入位置的时候采用二分法定位。二分法怎么定位?…… 运行结果: 原数组: 21、8、2、18、0、9、27、12、5、24、 第0次循环排序结果: 8、21、2、18、0、9、27、12、5、24、 第1次循环排序结果: 2、8、21、18、0、9、27、12、5、24、 第2次循环排序结果: 2、8、18、21、0、9、27、12、5、24、 第3次循环排序结果: 0、2、8、18、21、9、27、12、5、24、 第4次循环排序结果: 0、2、8、9、18、21、27、12、5、24、 第5次循环排序结果: 0、2、8、9、18、21、27、12、5、24、 第6次循环排序结果: 0、2、8、9、12、18、21、27、5、24、 第7次循环排序结果: 0、2、5、8、9、12、18、21、27、24、 第8次循环排序结果: 0、2、5、8、9、12、18、21、24、27、 直接看代码吧: public void binaryInsertionSort(int[] array) { printArray("原数组:", array); for (int i = 1; i < array.length; i++) { int temp =

二分法排序

戏子无情 提交于 2020-03-06 21:41:22
算法思想简单描述: 在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 中间的那个元素比,如果小,则对前半再进行折半,否则对后半 进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间 的所有元素后移,再把第i个元素放在目标位置上。 二分法排序最重要的一个步骤就是查找要插入元素的位置,也就是要在哪一个位置上放我们要准备排序的这个元素。当我们查找到位置以后就很好说了,和插入排序一样,将这个位置以后的所有元素都向后移动一位。这样就实现了二分法排序。  然后是怎么查找着一个位置呢,就是不断的比较已排序的序列中的中间元素和要排序元素,如果大于的话,说明这个要排序的元素在已排序序列中点之前的序列。 public static void DichotomySort(int[] array) { for (int i = 0; i < array.Length; i++) { int start, end, mid; start = 0; end = i - 1; mid = 0; int temp = array[i]; while (start <= end) { mid = (start + end) / 2; if (array[mid] > temp)//要排序元素在已经排过序的数组左边 { end = mid - 1; } else { start =

如何使用二分法实现“求一个数的平方根”?要求精确到小数点后 6 位。

寵の児 提交于 2020-03-03 08:19:22
如何使用二分法实现“求一个数的平方根”?要求精确到小数点后 6 位。 //precision精确度 //a原数据 double squareRoot(double a , double precision){ double low,high,mid,tmp; if (a>1){ low = 1; high = a; }else{ low = a; high = 1; } while (low<=high) { mid = (low+high)/2.000; tmp = mid*mid; if (tmp-a <= precision && tmp-a >= precision*-1){ return mid; }else if (tmp>a){ high = mid; }else{ low = mid; } } return -1.000; } int main(int argc, const char * argv[]) { double num = squareRoot(0.09, 0.000001); printf("%f",num); return 0; } 来源: CSDN 作者: 发霉的宅大人 链接: https://blog.csdn.net/Qinhaifu/article/details/104607672

二分法在循环有序数组查找元素

ぐ巨炮叔叔 提交于 2020-03-02 12:19:17
//在 O(logN) 时间内,从循环有序数组里查找元素 //二分之后,总有一半是有序数组 public static int searchInLoopSortedArray(int[] nums, int target) { if(nums.length == 0) return -1; int low = 0; int high = nums.length - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if(nums[mid] == target) return mid; if(nums[low] <= nums[mid]) { if(nums[mid] > target && nums[low] <= target) { high = mid - 1; } else { low = mid + 1; } } else if(nums[low] > nums[mid]) { if(nums[mid] < target && nums[high] >= target) { low = mid + 1; } else { high = mid - 1; } } } return -1; } 来源: CSDN 作者: 发霉的宅大人 链接: https://blog.csdn.net/Qinhaifu

Pie UVA - 12097 二分法

让人想犯罪 __ 提交于 2020-03-02 01:45:16
问题 分析 这道题和前面的题目有些相似之处,类似于最小值最大问题,但并不是,因为每个人要求一样大,假设答案是x,那么有的人分到x是因为只能得到x那么大的,有的人得到x是因为最小的是x,再多就切不出来了,实际上可以拿到一块大于x的派。 矛盾:只有一种矛盾,x太大,每块派只能切出 π ∗ r i 2 / x \pi*r_i^2/x π ∗ r i 2 ​ / x 块,加在一块小于f+1 # include <iostream> # include <cstdio> # include <cmath> # include <cstring> # include <map> # include <string> # include <vector> using namespace std ; typedef long long LL ; const int maxn = 10005 , Inf = 0x3f3f3f3f ; int T , n , f , pie [ maxn ] ; double s [ maxn ] , maxs ; inline bool check ( double x ) { int ans = 0 ; for ( int i = 0 ; i < n ; ++ i ) { ans + = s [ i ] / x ; } return ans >= f ; }

二分法

旧街凉风 提交于 2020-03-01 09:07:50
二分法查找 基本步骤 假设数据是按升序排序的,对于给定值key,从序列的中间位置mid开始比较 如果当前位置a[mid]值等于key,则查找成功; 若key小于当前位置值a[mid],则在数列的前半段中查找 另 begin = mid + 1; 若key大于当前位置值a[mid],则在数列的后半段中继续查找 另end = mid - 1; 直到找到为止,时间复杂度:O(log(n))[1]。 例题 代码实现 Position BinarySearch ( List L , ElementType X ) { int begin , end , mid ; if ( L == NULL ) return NotFound ; begin = 1 ; end = L -> Last ; mid = ( begin + end ) / 2 ; while ( begin <= end ) { if ( X > L -> Data [ mid ] ) begin = mid + 1 ; else if ( X < L -> Data [ mid ] ) end = mid - 1 ; else if ( X == L -> Data [ mid ] ) return mid ; mid = ( begin + end ) / 2 ; } return NotFound ; } 来源:

Assemble UVA - 12124 二分法

孤街浪徒 提交于 2020-03-01 01:24:22
问题 https://vjudge.net/problem/UVA-12124 分析 最小值最大,在保证总的花费少于b的情况下,使得质量的最小值最大。 使用二分法,对于质量进行二分法,每次取不同的质量x,计算最少的花费能否少于b,若少于,则尝试增加x,否则,减小x # include <iostream> # include <cstdio> # include <cmath> # include <cstring> # include <map> # include <string> # include <vector> using namespace std ; typedef long long LL ; const int maxn = 1005 , Inf = 0x3f3f3f3f ; int T , n , b , qua , price , cnt ; string s1 , s2 ; map < string , int > str2id ; vector < string > id2str ; struct Comp { int p , q ; Comp ( int p = 0 , int q = 0 ) : p ( p ) , q ( q ) { } } ; vector < Comp > comp [ maxn ] ; inline int ID (

二分法查找

…衆ロ難τιáo~ 提交于 2020-02-29 16:40:10
二分法查找适用查找一组有序数列,例如10,15,25,36,49,55,62,78,99,200这种单调递增的数列 二分查找的基本思想如下: 1、left对应数列第一个数的位置(即0),right对应数列最后一个数的位置(即n-1),mid设置为(left+right)/2。 2、比较需要查找的数值key和mid这个位置所对应的数值大小, 若key小于arry[mid],则right=mid-1,查找区间变为[left,mid-1] 若key大于arry[mid],则left=mid+1,查找区间变为[mid+1,right] 若key等于arry[mid],则查找成功 3、重复上述循环,直至查找成功或left>right 下面给出一张查找的例图,以数组10,15,25,36,49,55,62,78,99,200为例,查找78 查找14 下面贴出代码 public static void main(String args[]){ int[] arr ={10,20,30,40,50,60,70,80,90,100}; int num_input; int mid = 0; int left=0; int right; System.out.println("请输入要查找的数"); Scanner sc =new Scanner(System.in) ; num_input=sc