#include<stdio.h>
// 查找第一个大于key的元素,成功则返回该元素的下标,否则返回数组末元素的下一位
int findFirstLarger(int A[],int n, int key)
{
int left = ;
int right = n-; // 这里必须是 <=
while (left <= right) {
int mid = (left + right) / ;
if (A[mid] > key) {
right = mid - ;
}
else {
left = mid + ;
}
}
return left;
} void insert(int a[],int n)
{ int flag,temp,j,i,k; //3个元素要进行2趟排序
for(j=;j<n;j++){ //对位序1,2,3....n分别进行插入,bug隐藏在这,应该是1,2,3,n-1 //对[0,j-1]进行插入排序,将j指向的元素插入
flag = findFirstLarger(a,j,a[j]); if(flag ==j) continue ;
temp = a[j]; //保存将要插入的元素
//将i(flag待插入的那个位置)之后的元素后移动一位
for(k=j;k>flag;k--){
a[k]=a[k-];
}
//将temp插入到i这个位置
a[flag] = temp; } } int main()
{ int tt;
int a[] = {,,,,,,,,,,,-,,};
insert(a,);
for(tt=;tt<;tt++){
printf("%d\n",a[tt]);
}
return ;
}

典型错误:

//顺序查找第一个比key大的元素

int position1(int a[],int n,int key)//传入有序表和要查找的元素位置
{
int i;
for(i=;i<n;i++){
if(a[i]>key) return i; //这样做就不行了
}
return i+;
} //这个才是正确的
int position(int a[],int n,int key)//传入有序表和要查找的元素位置
{
int i,index=-;
for(i=;i<n;i++){
if(a[i]>key) index = i ; break; //从前往后是大于符号
}
if(index == -)
return n;
else return index;
}

(经典)直接插入排序based on 二分查找的更多相关文章

  1. 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序

    1.快速排序 实现: 1.取中间一个数作为支点 2.分别在支点的左右两边进行查找,如果左边查找到比支点大,右边查找到比支点小,就交换位置,如此循环,比支点小的数就排在了左边,比支点大的就排在右边 3. ...

  2. java 冒泡排序 二分查找 选择排序 插入排序

    下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...

  3. Leetcode 981. Time Based Key-Value Store(二分查找)

    题目来源:https://leetcode.com/problems/time-based-key-value-store/description/ 标记难度:Medium 提交次数:1/1 代码效率 ...

  4. Java基础知识强化60:经典查找之二分查找

    1. 二分查找       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...

  5. 经典算法二分查找循环实现Java版

    二分查找 定义 二分查找(Binary Search)又称折半查找,它是一种效率较高的查找方法. 要求 (1)必须采用顺序存储结构 (2)必须按关键字大小有序排列 查找思路 首先将给定值K,与表中中间 ...

  6. (经典) K&R的名著<<C程序设计语言>>二分查找

    #include<stdio.h> //查找成功则返回所在下标否则返回-1 int binsearch(int A[], int n,int a) { int low, high, mid ...

  7. JAVA源码走读(二)二分查找与Arrays类

    给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...

  8. js基本算法:冒泡排序,二分查找

    知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡 ...

  9. 二分查找实现(Jon Bentley:90%程序员无法正确实现)

    二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过 ...

随机推荐

  1. open-falcon设置报警邮件

    下载编译好的二进制包并解压: https://files.cnblogs.com/files/dylan-wu/mail-provider.tar.gz [root@localhost work]# ...

  2. c++第二十一天

    p115~p118: 1.区分int *p[4];和int (*p)[4];.前者是整型指针的数组,后者是指向含有4个整数的数组. 2.规避上述问题的方法就是:使用 auto和 decltype. 3 ...

  3. P1131 [ZJOI2007]时态同步(树形dp)

    P1131 [ZJOI2007]时态同步 设$f[i]$为与$i$与最远的点的距离 在dfs时每次更新的时候顺便统计一下长度,不同的话就改成最长的那条并更新答案 #include<iostrea ...

  4. POI之Excel导入

    1,maven配置 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-oox ...

  5. 20145104张家明 《Java程序设计》第5周学习总结

    20145104张家明 <Java程序设计>第5周学习总结 教材学习内容总结 第八章(概括为一下内容) 1.如果父类异常对象在子类异常前被捕捉,则catch子类异常对象的区块将永远不会被执 ...

  6. linux及安全第七周总结——20135227黄晓妍

    实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...

  7. HBuilder 获取通讯录

    代码: var content=""; function getCallLog() { try{ plus.contacts.getAddressBook(plus.contact ...

  8. c++ 容器排序

    #include <algorithm> #include <functional> #include <array> #include <iostream& ...

  9. Tensorflow一些常用基本概念与函数(一)

    1.tensorflow的基本运作 为了快速的熟悉TensorFlow编程,下面从一段简单的代码开始: import tensorflow as tf #定义‘符号’变量,也称为占位符 a = tf. ...

  10. UVA-1660 Cable TV Network (最小割)

    题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...