常用算法1 - 快速排序 & 二分查找
1. 二分查找法:
二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1。
二分查找法要求数据为一组有序的序列(大到小或小到大),但实际给出的数据往往是无序的,这是就需要先进行排序;排序算法有很多,但最有效、快速的当属快速排序算法。
2. 快速排序算法
1). 思想
快速排序采用的思想是分治思想。
- 找出一个元素(理论上元素随意)作为基准(pivot);
 - 对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置;
 - 递归快速排序,将其他n-1个元素也调整到排序后的正确位置;
 - 每个元素都是在排序后的正 确位置,排序完成.
 
所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
2). 步骤

(本图转自 https://www.cnblogs.com/MOBIN/p/4681369.html,做部分修改)
3. 示例代码
/*
 * This is used for bisection search
 * 1. sort the numbers in array
 * 2. bisection search the sorted array
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SEARCH 1
/*
 * For sort the number array
 */
int partition(int array[], int start, int end)
{
    int left_point, right_point;
    int pivot;      //Basic point
    left_point = start;
    right_point = end;
    pivot = array[left_point];
    while(left_point < right_point)
    {
        while((right_point > left_point) && (array[right_point] >= pivot))
        {
            right_point-- ;
        }
        array[left_point] = array[right_point];
        while((right_point > left_point) && (array[left_point] <= pivot))
        {
            left_point++ ;
        }
        array[right_point] = array[left_point];
    }
    array[left_point] = pivot;
    return left_point;      //the left_point is where pivot place
}
void quick_sort(int array[], int start, int end)
{
    if(start >= end)
    {
        return ;
    }
    int mid = 0;
    mid = partition(array, start, end);
    quick_sort(array, start, mid-1);
    quick_sort(array, mid+1, end);
}
/*
 * Bisection of the array to search the number
 */
int bisection(int array[], int key, int start, int end)
{
    if(start >= end)
    {
        return -1;
    }
    int mid = (start+end)/2;
    if(array[mid] == key)
    {
        return mid;
    }
    else if(array[mid] < key)
    {
        bisection(array, key, mid+1, end);
    }
    else if(array[mid] > key)
    {
        bisection(array, key, start, mid);
    }
}
/*
 * Main function, only for test
 */
int main(int argc, char *argv[])
{
    int array[10] = {10,9,8,7,6,5,4,3,2,1};
    quick_sort(array, 0, 9);
    int i=0;
    for(i=0; i<10; i++)
    {
        printf("array[%d]=%d\n",i,array[i]);
    }
    int pos=0;
    pos = bisection(array, SEARCH, 0, 9);
    if(-1 == pos)
    {
        printf("There was no key=%d\n",SEARCH);
    }
    else
    {
        printf("The key=%d, pos is %d\n", SEARCH,pos);
    }
    return 0;
}
												
											常用算法1 - 快速排序 & 二分查找的更多相关文章
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
		
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
 - C# 快速排序--二分查找法--拉格朗日插值法
		
1.快速排序 参考自: https://www.cnblogs.com/yundan/p/4022056.html namespace 快速排序算法 { class Program { static ...
 - 算法:时间复杂度+二分查找法(Java/Go/Python)实现
		
导读 曾几何时学好数据结构与算法是我们从事计算机相关工作的基本前提,然而现在很多程序员从事的工作都是在用高级程序设计语言(如Java)开发业务代码,久而久之,对于数据结构和算法就变得有些陌生了,由于长 ...
 - 【C/C++学院】0723-32位与64位/调戏窗体程序/数据分离算法/内存检索/二分查找法/myVC
		
[送给在路上的程序猿] 对于一个开发人员而言,能够胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够运用到系统中,由此简化系统的开发,是其架构生涯的第一步. ...
 - 算法学习之二分查找算法的python实现
		
——参考自<算法图解> 我们假设需要查找的数组是有序的(从大到小或者从小到大),如果无序,可以在第四行后插入一句 my_list.sort() 完整代码如下 def binary_sear ...
 - golang数据结构和算法之BinarySearch二分查找法
		
基础语法差不多了, 就需要系统的撸一下数据结构和算法了. 没找到合适的书, 就参考github项目: https://github.com/floyernick/Data-Structures-and ...
 - iOS常用算法之单链表查找倒数第n个节点(图解)
		
拿到题目, 首先要先了解链表数据结构, 如下图: 常规思路: 利用数组, 遍历整个单链表, 将每个节点装入数组中, 最终拿到数组根据索引(数组长度-1-n)就得到了倒数第n个元素, 这里要注意从数组中 ...
 - 二分查找算法java实现
		
今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...
 - Python二分查找算法
		
Python 二分查找算法: 什么是二分查找,二分查找的解释: 二分查找又叫折半查找,二分查找应该属于减值技术的应用,所谓减值法,就是将原问题分成若干个子问题后,利用了规模为n的原问题的解与较小规模( ...
 
随机推荐
- Docker技术:在微软云Azure上使用K8S
			
周末,受微软公司的邀请,参加微软主持的云容器培训会议,为参加培训的学院提供技术辅导,引导学员体验微软云端的DevOps实践. 说是辅导,实际上自己也学到了许多的内容,包括K8S集群.负载.Azure中 ...
 - 使用vue.js常见错误之一
			
打包项目时,在vscode中输入如下命令 webpack .\src\main.js .\dist\bundle.js 出现如下错误: WARNING in configurationThe 'mod ...
 - wpf expender 展开动画
			
非原创,网上下载的,觉得还可以,记录一下以便以后查看学习 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2 ...
 - XML Web Service架构图
 - .net程序中http请求的超时配置
			
请求时的超时 // // 摘要: // 获取或设置 System.Net.HttpWebRequest.GetResponse() 和 System.Net.HttpWebRequest.GetReq ...
 - Python 断言 assert 的用法
			
assert 后边接的表达式的返回值必须是布尔值 assert expression, "对错误的描述信息" 如果expression表达式返回的是True, 程序正常执行, 如果 ...
 - Flask从入门到精通之链接的使用
			
在Web开发中,任何具有多个路由的程序都需要可以连接不同页面的链接,例如导航条. 在模板中直接编写简单路由的URL 链接不难,但对于包含可变部分的动态路由,在模板中构建正确的URL 就很困难.而且,直 ...
 - ifconfig-dropped
			
drop的包是因为网卡的buffer满了 查看当前网卡的buffer size情况 ethtool -g eth0 Ring parameters for eth0: Pre-set maximums ...
 - MySQL 高级查询操作
			
目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...
 - Andrew Ng机器学习第五章——多变量线性回归
			
一.多变量线性回归的技巧之一——特征缩放 1.为什么要使用特征缩放? 特征缩放用来确保特征值在相似的范围之内. 设想这样一种情况(房价预测),两个特征值分别是房子的大小和卧室的数量.每个特征值所处的范 ...