(经典)直接插入排序based on 二分查找
#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 二分查找的更多相关文章
- 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序
1.快速排序 实现: 1.取中间一个数作为支点 2.分别在支点的左右两边进行查找,如果左边查找到比支点大,右边查找到比支点小,就交换位置,如此循环,比支点小的数就排在了左边,比支点大的就排在右边 3. ...
- java 冒泡排序 二分查找 选择排序 插入排序
下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...
- Leetcode 981. Time Based Key-Value Store(二分查找)
题目来源:https://leetcode.com/problems/time-based-key-value-store/description/ 标记难度:Medium 提交次数:1/1 代码效率 ...
- Java基础知识强化60:经典查找之二分查找
1. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...
- 经典算法二分查找循环实现Java版
二分查找 定义 二分查找(Binary Search)又称折半查找,它是一种效率较高的查找方法. 要求 (1)必须采用顺序存储结构 (2)必须按关键字大小有序排列 查找思路 首先将给定值K,与表中中间 ...
- (经典) K&R的名著<<C程序设计语言>>二分查找
#include<stdio.h> //查找成功则返回所在下标否则返回-1 int binsearch(int A[], int n,int a) { int low, high, mid ...
- JAVA源码走读(二)二分查找与Arrays类
给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序.比较数组:通过equals方法比较数组中元素值是否相等.查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找 ...
- js基本算法:冒泡排序,二分查找
知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡 ...
- 二分查找实现(Jon Bentley:90%程序员无法正确实现)
二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过 ...
随机推荐
- VS2010/MFC编程入门之前言
鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了.但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口.鸡啄米在这套VS2010/M ...
- uva1292 树形dp
这题说的是给了一个n个节点的一棵树,然后 你 从 这 棵 树 的 n 个 节点中 选择 尽量少的 点使得 每条边都至少有一个 士兵看守 dp[0][i]+=dp[1][j] dp[1][i]+=min ...
- linux wa%过高,iostat查看io状况
命令总结: 1. top/vmstat 发现 wa%过高,vmstat b >1: 参考文章: 1. 关于Linux系统指令 top 之 %wa 占用高,用`iostat`探个究竟 最近测试一项 ...
- Linux Makefile
动态库: gcc getmaxlen.c –fPIC –shared –o libtest.so ldd -r libtest.so 静态库: ar crv libfirst.a testlib ...
- MySql数据库的安装和卸载
- SQL学习笔记四(补充-1-1)之MySQL单表查询补充部分:SQL逻辑查询语句执行顺序
阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SELECT语句关键字的定义顺序 SELE ...
- bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...
- 使用 log4js UDP 发送数据到 logstash
本文地址 http://www.cnblogs.com/jasonxuli/p/6532723.html 因为 nodejs 一般会部署在多台机器,并且每台机器会起多个进程,因此查看日志时往往要人工区 ...
- 在Ubuntu 18.04上安装Tensorflow
我们将经历几个阶段,安装cuda-9.0,cudnn和tensorflow cpu以及tensorflow gpu版本.最后我们将用cuda-9.0安装pytorch.在MARVEl电影中黑寡妇的“我 ...
- POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)
http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...